zoukankan      html  css  js  c++  java
  • Swift4.0复习结构体

    1.基本语法:

    /** 定义了一个结构体 */
    struct Structure {
         
        /// 一个常量存储式实例属性,
        /// 并直接为它初始化
        let constProperty = 10
         
        /// 一个变量存储式实例属性
        var property: Int
         
        /// 初始化器
        init() {
            property = 0
        }
         
        /// 实例方法
        func method() {
            print("This is a structure")
        }
    }
     

    2.存储式实例属性:

    “在Swift中,结构体属于值类型,所以用一个对象对另一个对象进行初始化时,所采取的策略是属性复制,而不是引用机制。在此之后,我们可以看到test与test2两个对象就有各自的实例属性了。当test2的实例属性进行修改之后,test对象中的实例属性不会受任何影响。”
    
    摘录来自: “大话Swift 4.0”。 iBooks. 

    3.惰性存储式属性:

    /// 定义一个函数,用于获取一个整数值
    func fetchData() -> Int {
        print("data fetched!")
        return 100
    }
     
    struct Test {
         
        /// 声明了一个惰性存储式实例属性prop,
        /// 当它被第一次访问的时候才会调用fetchData函数对它初始化
        lazy var prop = fetchData()
    }

     4.计算式属性:

    计算型属性只能用var,不能用let

    /// 定义了一个Circle结构体,表示圆
    struct Circle {
         
        /// radius是一个Double类型的存储式实例属性
        var radius = 0.0
         
        /// 这里定义了用于表示直径的计算式实例属性
        var diameter: Double {
             
            // 定义它的getter方法。
            // 这里要注意的是,
            // getter方法的返回类型必须缺省!
            // 其返回类型就是该计算式实例属性的类型
            get {
                return radius * 2.0
            }
             
            // 定义它的setter方法。
            // 这里各位要注意的是,
            // setter方法形参的类型必须缺省!
            // 该形参类型就是该计算式属性的类型
            set(value) {
                radius = value / 2.0
            }
        }

    set方法参数缺省,其隐式的形参标识符为newValue。

    5.属性观察者:

    /// 定义一个Test结构体
    struct Test {
         
        /// 这里声明了number存储式实例属性,
        /// 其类型为Int,并且初始化为0
        var number = 0 {
             
            // 这里定义了number的willSet属性观察者,
            // 当number属性的值发生改变之前会调用此方法。
            // 这里参数value是即将传给number的新值,
            // 其类型与number相应。
            willSet(value) {
                print("current value = (number)")
                print("new value = (value)")
            }
             
            // 这里定义了number的didSet属性观察者,
            // 当number属性的值修改完之后就会调用此方法。
            // 这里参数orgValue是指在修改number属性之前的值,
            // 其类型与number相应。
            didSet(orgValue) {
                print("original value = (orgValue)")
                print("modified value = (number)")
            }
        }
    }

    属性观察者中 willSet 方法以及 didSet 方法中的参数均可缺省。如果 willSet 方法的参数缺省,那么它对应的一个隐式参数标识符为 newValue。如果 didSet 方法中的参数缺省,那么它对应的一个隐式参数标识符为 oldValue。

    一般来说,我们在属性观察者中 didSet 方法使用更多些,许多过滤操作都在此方法中进行。而 willSet 方法中则可记录一些数据统计,或对其他一些对象发送某些消息等。

    6.类型属性:

    枚举、结构体以及类类型都能定义属于自己的类型属性,而且声明方法非常简单,
    只需要在属性声明最前面添加 static 关键字即可。类型属性与实例属性一样,
    也具有存储式类型属性、计算式类型属性以及针对存储式类型属性的属性观察者。
    由于类型属性本身具有惰性特质,所以我们不能用 lazy 去修饰它们。
    此外,对于计算式类型属性,如果定义在一个类类型中,那么还可以使用 class 关键字去声明,
    表示允许其子类覆盖当前类的实现。

    7.实例方法:

    8.类型方法:

    直接在 func 前面添加 static 关键字即可。
    如果当前类型是类类型,那么我们还能使用 class 关键字修饰,表示当前类型方法能被子类重写。
    如果在类类型中用了 static 关键字去修饰类型方法,那么该类型方法就不允许被子类重写了。

    9.初始化器方法:

    struct Test {
       var a = 10
       let b: Float
       
       init() {
          b = 1.0
      }
    }

    10.逐成员的初始化器方法:

    11.值类型的初始化器代理:

    12.可失败的初始化器:

    /// 定义一个结构体类型Test
    struct Test {
         
        /// 定义一个存储式实例属性a,
        /// 它未被直接被初始化
        var a: Int
         
        /// 这里定义了一个可失败的初始化器方法。
        /// 大家注意,这里的 init 与 ? 之间不允许出现任何空白字符。
        init? (value: Int) {
            if value == 0 {
                // 若形参value的值等于0,那么直接返回空
                return nil
            }
             
            a = 100 / value
             
            // 在可失败的初始化器方法中只能使用 return nil 语句,
            // 所以return后面不能添加其他对象或值
        }
    }
     
    // 这里使用可失败的初始化器尝试创建一个对象实例。
    // 这里test的类型为:Test?
    let test = Test(value: 0)
     
    if test == nil {
        // 这里将会输出Failed!
        print("Failed!")
    }

    13.下标语法:

  • 相关阅读:
    Python3安装turtle提示错误:Command "python setup.py egg_info" failed with error code 1
    慕学生鲜xadmin登录不成功解决办法
    mysql删除后ID不连续解决办法
    Mac 安装gevent
    ubuntu 下 docker的简单使用
    python 字典的一些简单操作
    列表推导式
    Serializer字段和选项
    添加包解决一些导包问题
    css 文本换行,文本空白符处理相关 属性:white-space word-wrap word-break
  • 原文地址:https://www.cnblogs.com/pengsi/p/8494494.html
Copyright © 2011-2022 走看看