标签:
Swift中属性是描述特定类、结构或者枚举的值,可以分为以下几种:
1.存储属性(Stored Properties)
2.计算属性(Computed Properties)
3.类型属性(Type Properties)
存储属性:
//存储属性就是实例对象的该属性不需要自己额外实现方法,直接简单明了->存取原始值 struct name { var firstName :String let lastName :String }
计算属性:
//计算属性就是实例对象的该属性是根据其他数据算出自己本身的值,必须自己实现get方法,set可选实现
struct name { var firstName :String //存储属性 let lastName :String //存储属性 var fullName :String //计算属性,没有get set声明,默认生成get,只读 { return firstName + lastName // get{ // return firstName + lastName // }
// set{
// //do something
//
}
}}
类型属性:
//类型属性简单的说就是计算属性或存储属性从实例对象使用转变到类使用...但是无法实现willset didset属性监听 可以通过set //------------------------结构体--------------------- struct TestStruct { static var typePropertyInStructOrEnum = "这是结构体和枚举中的类型属性的定义方式1" } TestStruct.typePropertyInStructOrEnum; //------------------------枚举--------------------- enum TestEnum { static var typePropertyInStructOrEnum : NSString{ return "这是结构体和枚举中的类型属性的定义方式2"
}
} TestEnum.typePropertyInStructOrEnum; //------------------------类--------------------- class TestClass { class var typePropertyInClass : String{ //类型属性 return "这是类中的类型属性的定义方式" } } TestClass.typePropertyInClass
属性监听:
存储属性可以添加如下的一个或全部监视器:
willSet监视器会将新的属性值作为固定参数传入,在willSet的实现代码中可以为这个参数指定一个名称,如果不定义参数使用默认名称newValue表示。
didSet监视器会将旧的属性值作为参数传入,可以自己定义的参数命名或者使用默认参数名oldValue。
struct Name { var firstName :String //存储属性 { willSet{ print("firstName 将从 \(firstName) 改变到 \(newValue)"); } didSet{ print("\nfirstName 已从 \(oldValue) 改变到 \(firstName)\n"); } // didSet(val){ // print("firstName 已从 \(val) 改变到 \(firstName)"); // } } var lastName :String //存储属性 var fullName :String //计算属性,没有get set声明,默认生成get,只读 { return firstName + lastName } } //初始化时监听无效的 var name = Name(firstName: "onebyte", lastName: "yy") //下面这句监听有效 name.firstName = "11" //log : //firstName 将从 onebyte 改变到 11 //firstName 已从 onebyte 改变到 11
而计算属性则在set里面实现监听:
struct Name { var firstName :String //存储属性 var lastName :String //存储属性 var fullName :String //计算属性,没有get set声明,默认生成get,只读 { get{ return firstName + lastName } set{ //do something before set(willSet) //set (比如根据某种分割或者规则设置firstName lastName) //do something after set(didSet) } } }
注意点:
name.firstName = "11" 调用的是 name实例中的firstName的set
var nFirtNameStr = name.firstName 调用的是name实例中firstName的get
所以不能在get中取firstName的值,或者set中设置firstName中的值,不然造成死循环 bad_access
标签:
原文地址:http://www.cnblogs.com/imhere/p/4262158.html