美文网首页
swift学习之属性

swift学习之属性

作者: 天蚕 | 来源:发表于2016-05-12 01:36 被阅读68次

属性

存储属性

存储属性就是一个存储常量let或者变量var的属性
存储属性有一个专属技能lazy(延时加载或懒加载)
lazy必须与var=同时出现
lazy表达式 =右边必须是一个常量(闭包的简化)或者一个执行闭包
存储属性的标志let=lazy var,属性表达式存在任何一个标志都是存储属性

class Person
{
     //存储属性
     let name:String = "小史"
     lazy var age:Int = 0
     var firstName:String?
    lazy var secondName:String = {
        return "hello" + "world"
    }()
}

计算属性

计算型属性通常依赖于其他属性

计算属性不直接存储变量值,而是通过gettersetter方法来操作变量值getter取值setter赋值
为了防止死循环计算属性的gettersetter方法实现需要一个中间变量属性来完成
计算属性的getter方法是必须实现的,setter方法可以选择实现
计算属性如果只实现了getter方法,就是只读属性
计算属性操作的是变量值,只能用var

class Person{
    private var _name:String?//中间变量属性
    var name:String?{
        get{
            return _name
        }
        set{
            _name = newValue
        }
    }

   //只读属性实现,只读属性可以省略get关键字及一对{}
    var realName:String{
         print(_name)
         return _name
    }
}

类型属性

类型属性也区分计算属性和存储属性
static修饰的既可以是计算属性也可以是存储属性
class修饰的属性只能是计算属性
需要在子类当中重写的类型属性,必须使用class修饰,这里的重写包括添加属性观察器
永远不要用用lazy修饰一个类型属性(lazy是存储属性的专属但是默认存储类型属性本身就是lazy的)
出过以上三条其余参照上面实例属性

class Person{
    static var firstName = "小史"
    private static var _secondName = "😄"
    class var secondName:String{
        get{
              return _secondName
        }
        set{
              _secondName = newValue
        }
   }
}

属性观察器

属性观察器最常用的方式就是在属性观察器方法中更新UI,当然像OC一样在setter方法中更新UI也是不错的选择,个人感觉因为实现setter就必须实现getter,然而我们只需要的是setter,getter并没有什么卵用,所以还不如直接写在观察器方法中更新UI
属性的初始化不会触发属性观察器

给当前类添加属性观察器

只能给lazy之外的存储属性添加属性观察器

var storedProperty:String?{
    //willSet默认携带newValue参数,当然参数名称可以自行定义
    willSet
    {
        //更新UI
        print(newValue)
    }
    //didSet默认携带oldValue参数,当然参数名称可以自行定义
    didSet
    {
        //更新UI
        print(oldValue)
    }
}

给继承属性添加属性观察器

子类可以给任何继承而来的非let属性添加属性观察器,包括全局属性
只能通过override重写属性给继承属性添加属性观察器
重写属性必须明确属性的类型,方便编译器定位哪个属性需要重写

override var storedProperty:String?{
    //willSet默认携带newValue参数,当然参数名称可以自行定义
    willSet
    {
        //更新UI,这里的newValue是将要赋给storedProperty的值,每次拿到的都是新值
        print(newValue)
    }
    //didSet默认携带oldValue参数,当然参数名称可以自行定义
    didSet
    {
        //更新UI这里的oldValue是storedProperty赋新值前的值,第一次拿到的就是nil,可选类型为赋新值就是nil
        print(oldValue)
    }
}

重写

重写关键字override,子类可以重写父类的函数或者属性,这里着重讨论重写属性,这里的重写包括给继承属性添加(或者重写)属性观察器和重写属性的setter和getter方法
子类可以给任何继承而来的非let属性重写(添加)属性观察器和getter,setter方法,包括计算属性和存储属性
在写setter和getter的时候,可以将一个集成来的只读属性,重写写成一个读写属性,但是不能将一个读写属性重写成一个只读属性,就像不能将一个float值赋给一个double型,但是不能把一个double型赋值给一个float型一样,会截断

private var _storedProperty:String? = "属性" 
override var storedProperty:String?{
    get
    {
         return _storedProperty
    }
    set
    {
         _storedProperty = oldValue
    }
}

在方法或属性定义关键字前面添加final关键字表明该属性或者方法不能被重写
在类定义前添加final关键字表明该类不能被继承

全局变量

默认的swift中的全局变量都是延时加载的与实例属性的懒加载属性是相似的(但是并没有显式的lazy关键字)

相关文章

  • swift学习之属性

    属性 存储属性 存储属性就是一个存储常量let或者变量var的属性存储属性有一个专属技能lazy(延时加载或懒加载...

  • Swift5.x- 方法(中文文档)

    引言 继续学习Swift文档,从上一章节:属性,我们学习了Swift属性相关的内容,如存储属性和计算属性set和g...

  • 《Swift从入门到精通》(七):属性

    属性(学习笔记) 环境Xcode 11.0 beta4 swift 5.1 属性(Properties)属性是把值...

  • Swift学习:属性

    本篇将详细总结介绍Swift属性的用法;属性是与特定的Swift类、结构体、枚举相关联的值;与其他语言相比,属性不...

  • Swift学习:属性

    举例: Under The Hood ==存储属性的本质是一个存储变量+两个访问器方法(get,set)====计...

  • swift学习-属性

    属性可以分为实例属性和类型属性 实例属性:只能通过实例去访问 存储属性:存储在实例的内存中,每个实例都有一份 计算...

  • Swift学习笔记六之属性

    1、只能在类和结构体中存储常量和变量struct Location{ //描述位置的结构体var x:Do...

  • Swift之属性

    属性 属性将与指定类,结构体,枚举相关联。 存储属性: 将常量和变量存储为实例的一部分。有类,结构体提供。计算属性...

  • Swift之属性

    存储属性 存储常量或者变量的 要么给它默认值,要么在构造方法里初始化 计算属性 计算属性不直接存储值 访问时候调用...

  • Swift笔记(一)属性、析构、调用OC单例

    目录 swift属性存储属性懒加载属性计算属性属性监听类型属性 swift析构函数 swift调用OC单例类方法 ...

网友评论

      本文标题:swift学习之属性

      本文链接:https://www.haomeiwen.com/subject/abfyrttx.html