Swift---10.属性

  • 属性(类,结构体或枚举中,某一个成员变量,就是该类,结构体或枚举的属性)

    • 存储属性

存在于类,结构体中,枚举中不存在,定义属性时,可以定义属性的类型,默认值.与定义变量常量相同,使用var表明该属性是变量,let表明该属性是常量.
class FirstClass { var firstValue:String? var secondValue = 2 let thirdValue = 3 } struct FirstStruct { var firstValue:String? var secondValue = 2 let thirdValue = 3 } //类是引用类型,就算被赋值给一个常量,也依然可以修改其值 let firstClass = FirstClass() firstClass.secondValue = 3 //报错,结构体是值类型,如果定义为常量,则所有的值都不可以被改变 let firstStruct = FirstStruct(firstValue: "first", secondValue: 3) firstStruct.secondValue = 4
- #####延迟存储属性
在成员名前,添加lazy关键字,表明该属性只会在使用到的时候才被创建,由于不是一开始就定义的成员,所以我们必须设置改成员为变量.lazy属性线程不安全
class FirstClass { var firstValue:String? lazy var secondValue:Int = { return 2 }() let thirdValue = 3 } let firstClass = FirstClass() firstClass.secondValue
- 计算属性(计算属性不存储值,它提供了setget方法,使我们可以间接的操作其他变量或者属性,写法为在计算属性的类型后添加尾随闭包,在闭包中添加setget方法,set方法中,系统默认为我们提供了newValue参数)
//定义一个结构体 struct number { var a = 0 var b = 0 } //定义类 class TestGetSet { var total:Int = 0 var number:number{ get { return self.number } set (newNumber) { total = newNumber.a + newNumber.b } } var number1:number{ get { return self.number } set { total = newValue.a + newValue.b } } } let test = TestGetSet() test.number = number(a: 3, b: 4) print(test.total)
- 只读计算属性(了解OC的,应该知道,定义类属性时,会有一个readOnly选项,即改属性只有getter没有setter,Swift中,对于计算属性同样提供了只读选项,只要闭包中不提供set方法,即指明该计算属性为只读属性.同样的,我们可以省略关键字get)
struct total { var a:Int = 0 var b:Int = 0 var total:Int{ return a+b } } let test = total(a: 10, b: 10) test.total
- 注意我们使用只读计算属性时,必须使用var关键字,因为只有变量才能改变值
- 属性监听者(属性拥有监听者,延迟存储除外,在属性的值改变时,他们会被调起.需要注意非继承的计算属性不需要添加监听者,因为我们可以在它的set方法中监听到属性的变动)
- willSet(即将设置时,跟计算属性的set方法一样,Swift也为其提供了默认的newValue)
- didSet(设置完成后,该方法提供了默认值为oldValue,在didSet方法中,对该属性的操作不会重新引起didSet的调用)
class Obersevers { var number:Int = 0{ willSet { print("将要设置number为\(newValue)") } didSet { print("number由\(oldValue)变为\(number)") } } } let oberse = Obersevers() oberse.number = 10
- 类属性(类似与OC中的类方法,可以由类直接调起,使用static定义,若想要让它的子类可以对其进行重写,需要使用class关键词)
class StaticTest { static var number = 10 static var numberTimeFive:Int{ return number * 5 } } print(StaticTest.numberTimeFive) StaticTest.number = 5 print(StaticTest.numberTimeFive)
- 使用闭包或函数设置属性的默认值
class SetDefault { var board:[Bool] = { var tempArray = [Bool]() var isBlack = false for i in 1...8 { for j in 1...8 { tempArray.append(isBlack) isBlack = !isBlack } isBlack = !isBlack } return tempArray }() func squareIsBlackAt(row: Int, column: Int) -> Bool { return board[(row * 8) + column] } } let setDefault = SetDefault() setDefault.squareIsBlackAt(row: 2, column: 1)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,831评论 2 9
  • SwiftDay011.MySwiftimport UIKitprintln("Hello Swift!")var...
    smile丽语阅读 3,857评论 0 6
  • 基础部分(The Basics) 当推断浮点数的类型时,Swift 总是会选择Double而不是Float。 结合...
    gamper阅读 1,332评论 0 7
  • 孩子,今天接你时你哭得很伤心 爸爸一看到你就知道了 肯定没有考好 你的内心逃不过我的双眼 我们俩相伴十二年了 你肚...
    XiaoGuoPing阅读 181评论 1 0
  • 我是一个如风般的女子,淡然而随性,可谁说风没有心呢?正因为习惯了孤独,才不会觉得孤独,正因为没有归属,才不去寻求安...
    行云_luo阅读 563评论 4 15