2016-09-16 20:48:18 github_26672553 阅读数 4253

Swift中类的属性有多种
存储属性:存储实例的常量和变量
计算属性:通过某种方式计算出来的属性
类属性:与整个类自身相关的属性

一、存储属性

存储属性是最简单的属性,它作为类实例的一部分,用于存储常量和变量;
可以给存储属性提供一个默认值,也可以在初始化中个对其进行初始化。
下面是存储属性的写法:

//: Playground - noun: a place where people can play

import UIKit

class Student : NSObject {
    // 定义存储属性
    var age : Int = 0
    var name : String?  // “?”符号,表示name为可选类型,初始化值为nil
}

// 实例化类
let stu = Student()
// 给属性赋值
stu.age = 10
stu.name = "jack"

// 获取属性值
print(stu.age)  // 10

// 因为name是可选类型,可以进行解包 stu.name!
// 但解包是一个危险的操作,所以一般采用可选绑定的方式
if let name = stu.name {
    print(name)
}

二、计算属性

再定义2个属性:

    // 数学成绩
    var mathScore : Double = 0.0
    // 语文成绩
    var chineseScore : Double = 0.0

给这个2个属性赋值并计算平均成绩:

stu.mathScore = 78
stu.chineseScore = 88.88

// 计算平均成绩
let avgScore = (stu.mathScore + stu.chineseScore) * 0.5
print(avgScore)

那么问题来了:如果这个平均成绩我们在很多地方都要用到,每次都像上面这样写就未免太low了吧?

1.诶,可以写个方法专门获取平均成绩啊:

    // 定义一个方法,返回平均成绩
    func getAvgScore() -> Double {
        return (mathScore + chineseScore) * 0.5
    }

调用该方法:

print(stu.getAvgScore())

2.难道Swift就没有什么高大上的方式么?

    // 定义计算属性:通过别的方式计算到结果的属性称之为计算属性
    var avgScore : Double {
        return (mathScore + chineseScore) * 0.5
    }

然后访问这个属性就拿到平均成绩了:

print(stu.avgScore)

三、类属性

定义:

    // 定义类属性
    static var courseCount : Int = 0

访问:

//  通过类名访问类属性
Student.courseCount = 2
2017-11-15 18:05:59 qq_30932479 阅读数 571

Swift 中的属性分为两类:一种是存储属性,把常量或变量的值作为实例的一部分;另一种是计算属性,它计算一个值,类似于方法的功能,提供了一个处理数据的入口与出口。计算属性可以用于类、结构和枚举里,存储属性只能用于类和结构体里。


存储属性的作用是把常量或变量的值作为实例的一部分,使用var关键字定义的属性为变量存储属性,使用let关键字定义的属性为常量存储属性。

在Swift中,类在初始化的时候它的属性必须都被初始化。如果不想设置某个属性的默认值,则可使用"?"把它加入可选链中,声明为可选类型。

class Student {
    
    var name:String?
    var age:Int = 10
    
}

规则:类初始化其属性必须初始化。                                                                                                                                                                                                                                 

计算属性 不直接存储值,而是提供一个getter来获取值,然后用一个可选的setter来间接设置其他属性或变量值。


class newClass {
    
    var givenName = "张"
    var firstName = "小龙"
    
    var allName: String {
        
        get {
            return givenName + firstName
        }
        
    }
}

计算属性中getter方法通过访问触发,setter方法通过赋值触发



2015-03-17 23:20:45 qq350116542 阅读数 2432

前面我们基本上把Swift的基本内容过了一边, 但这并不足以让我们在开发中良好的运用, 现在让我们继续来往下学习吧:


1.全局变量和局部变量

在前面我们讲解了计算属性和属性监视器, 它们所描述的模式也是可以用于全局变量和局部变量, 所谓的全局变量和局部变量其实是和OC中里的一致, 没有多大区别,

并且全局或局部变量都属于存储型变量, 跟存储属性类似, 它提供特定类型的存储空间, 并允许读取和写入。

另外, 在全局或局部范围都可以定义计算型变量和为存储型变量定义监视器,计算型变量跟计算属性一样, 返回一个计算的值而不是存储值, 声明格式也完全一样。

PS: 全局的常量或变量都是延迟计算的, 跟延迟存储属性相似, 不同的地方在于, 全局的常量或变量不需要标记 lazy 特性; 局部范围的常量或变量不会延迟计算。


2.类型属性

在我们实际开发中, 实例的属性是属于特殊的类型属性, 同时也可以为类型本身定义属性, 不管类型有多少个实例,这些属性都只有唯一一份, 这种属性就是类型属性。

类型属性用于定义特定类型所有实例共享的数据,比如所有实例都能用的一个常量, 或者所有实例都能访问的一个变量.

对于值类型(指结构体和枚举)可以定义存储型和计算型类型属性, 对于类(class)则只能定义计算型类型属性, 值类型的存储型类型属性可以是变量或常量, 计算型类型属性跟实例的计算属性一样定义成变量属性.

PS: 跟实例的存储属性不同,必须给存储型类型属性指定默认值,因为类型本身无法在初始化过程中使用构造器给类型属性赋值。


3.类型属性语法

在 C 或 Objective-C 中, 静态常量和静态变量的定义是通过特定类型加上 global 关键字, 在 Swift 编程语言中, 类型属性是作为类型定义的一部分写在类型最外层的花括号内, 因此它的作用范围也就在类型支持的范围内.

使用关键字 static 来定义值类型的类型属性,关键字 class 来为类(class)定义类型属性, 比如:

struct SomeStructure {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
}

enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 2
    }
}

class SomeClass {
    class var computedTypeProperty: Int {
        return 3
    }
}

PS: 例子中的计算型类型属性是只读的, 但也可以定义可读可写的计算型类型属性, 跟实例计算属性的语法类似.


4.获取和设置类型属性的值

在上面的例子, 我们是定义好了属性, 如果我们要取里面的属性, 是和我们在实例的时候一致的, 比如:

println(SomeClass.computedTypeProperty)
// 打印出来的结果: 3

println(SomeStructure.storedTypeProperty)
// 打印出来的结果: Some value.

SomeStructure.storedTypeProperty = "Another value."
println(SomeStructure.storedTypeProperty)
// 打印出来的结果: Another value.

这样子我们就可以访问类型中的属性了, 还有另外一个例子, 让我们来看看:
例子


struct AudioChannel {
    static let thresholdLevel = 10
    static var maxInputLevelForAllChannels = 0

    var currentLevel: Int = 0 {
    didSet {
        if currentLevel > AudioChannel.thresholdLevel {
            // 将新电平值设置为阀值
            currentLevel = AudioChannel.thresholdLevel
        }
        if currentLevel > AudioChannel.maxInputLevelForAllChannels {
            // 存储当前电平值作为新的最大输入电平
            AudioChannel.maxInputLevelForAllChannels = currentLevel
        }
    }
    }
}

var leftChannel = AudioChannel()
var rightChannel = AudioChannel()

leftChannel.currentLevel = 7

println(leftChannel.currentLevel)
// 打印出来的结果: 7
println(AudioChannel.maxInputLevelForAllChannels)
// 打印出来的结果: 7

rightChannel.currentLevel = 11

println(rightChannel.currentLevel)
// 打印出来的结果: 10
println(AudioChannel.maxInputLevelForAllChannels)
// 打印出来的结果: 10

PS: 由于上面做了个限制, 该电频最高就只能到达10, 所以一旦你输入大于10的数, 这里都会默认输出10.


好了, 这次我们就讲到这里, 下次我们继续~

2016-10-30 19:51:47 wang631106979 阅读数 3951

OC中我们经常用到只读属性,用readonly修饰一下就行了,但在Swift中已经不是这样修饰的了,下面记录一下Swift中只读属性的使用

OC中的只读:

//只读属性
@property(readonly, nonatomic) NSObject *wcl;

Swift中的只读:

//只读属性
private(set) var wcl
2016-09-18 13:44:31 potato512 阅读数 608

Swift变量的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值"

当你声明一个可选变量或者可选属性的时候没有提供初始值,它的值会默认为nil

如果一个可选类型的实例包含一个值,你可以用后缀操作符!来访问这个值。但使用操作符!去获取值为nil的可选变量会有运行时错误。

你可以用可选链接和可选绑定选择性执行可选表达式上的操作。如果值为nil,任何操作都不会执行,也不会有运行报错。


// 定义变量,且未初始化值时,同时未使用符号" ! ",或" ? "则会报错。符号" ! ",或" ? "必须紧接在变量类型之后(未初始化值时,必须声明类型)
var name : String!
print("name: \(name)")
        
name="DevZhang"
        
if name == nil
{
         print("name is nil")
}
else
{
         print("name is \(name)")
}
        
if (name != nil)
{
         print("name is \(name)")
}
else
{
         print("name is nil")
}

// 可选值可以使用if语句进行判断
let className:String? = "class 8"
if (className != nil)
{
            print("class name is \(className)")
}

// 可选值可以使用有感叹号!进行强制解析,强制解析时必须有值(如果可选值没有值时,强制解包会出现编译进行时异常crash)
let subClassName:String = className!
print("sub class name is \(subClassName)")
// 使用可选绑定(即不声明变量的数据类型),避免强制解包时的异常
if let subClassName2 = className
{
            print(subClassName2)
}

// optionals可选值,数据类型后添加关键字!表示隐式解析,即确保变量总是有值,获取值时无需再进行解析。
let gladeName:String! = "glade 3"
print(gladeName)

let subGladeName:String = gladeName
print(subGladeName)





Swift存储属性

阅读数 592

Swift学习:属性

阅读数 305

Swift 属性

阅读数 25

没有更多推荐了,返回首页