Swift基础学习笔记(关于类)

构造函数

在 OC 中的构造函数是 initWithXXX,在 Swift 中由于支持函数重载,所有的构造函数都是 init

新建Person类,定义了必选属性

   class Person: NSObject {
    //此处定义了必选属性
    var name: String
    var no: Int
    override init() {
        //如果一个类中定义了必选属性,必须为这些必选属性分配空间并且设置初始值
        name = "simapierce"
        no = 12345
        //调用父类的构造函数初始化父类的属性
        super.init()
    }
}

        // 创建对象
        let p = Person()
        //此时打印初始化设置的值
        print(p.name,p.no)

总结:

  • 必选属性,必须为他们设置初始值,从而保证对象在被实例化的时候,属性都被正确初始化
  • 在调用父类构造函数之前,必须保证本类的属性都已经完成初始化
  • Swift 中的构造函数不用写 func
新建Human类,定义可选属性 ,默认为nil
class Human: NSObject {
    var name: String?
    var height: Float?
}
//使用
        let h = Human()
        h.name = “jack”//此处不赋值的话,打印出为nil
        print(h.name ?? "anonymous”)//此处不解包的话,为optional(jack)
  • 可选属性不需要设置初始值,默认初始值都是 nil
  • 可选属性是在设置数值的时候才分配空间的,是延迟分配空间的,更加符合移动开发中延迟创建的原则

重载和重写

  • 重载,函数名相同,参数名/参数类型/参数个数不同
    • 重载函数并不仅仅局限于构造函数
    • 函数重载是面相对象程序设计语言的重要标志
    • 函数重载能够简化程序员的记忆
    • OC 不支持函数重载,OC 的替代方式是 withXXX…
  • 重写,子类需要在父类拥有方法的基础上进行扩展,需要 override 关键字

KVC

KVC本质上是在运行时,动态向对象发送setValue: forKey:方法,为对象的属性赋值,因此,在使用KVC方法之前,要确保对象已经被正确实例化

class Human: NSObject {
    //可选项的默认值是nil,可选项会默认为我们分配空间
    var name: String?

    //基本数据类型在Swift ,与KVC不兼容
    //如果基本数据类型为nil,KVC在调用 setValue(value: AnyObject?, forKey key: String) 找不到这个属性
    //解决办法:给基本数据类型设置初始值
    var height: Float = 0

    init(dict: [String: NSObject]) {
         super.init()
        setValuesForKeysWithDictionary(dict)
    }
    //在OC中,当模型类中的属性比字典的key少时会崩溃,此时重写forUndefinedKey,即使字典中的key多于模型类属性,也不会崩溃 ,
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
     //什么都不用做
    }
}
//使用
//       let h = Human(dict: ["name":"jack","height":12,"age":12])
//        print(h.name)

子类可以继承父类的KVC构造方法,不用再重写

便利构造函数

    convenience init?(targetHeight: Float){
        if targetHeight < 160.0 {
          return nil
        }
        self.init(dict: ["height": targetHeight])
    }
使用:
        let h = Human(targetHeight: 159)
        print(h?.height)
  • 关键字 convenience修饰
  • 可以返回nil
  • 用self调用本类中定义的其他构造函数或者调用父类的便利构造函数

用途:根据给定参数判断是否创建对象,而不像指定构造函数那样必须要实例化一个对象出来
在实际开发中,可以对已有类的构造函数进行扩展,利用便利构造函数,简化对象的创建
,例如创建button时做判断,如果没有为其设置title等,返回空

懒加载

 //懒加载 -- 最简单的懒加载
   lazy var p: Person = Person()
//其他用法,类似闭包
    lazy var label: UILabel = {

        let label = UILabel()

        label.font = UIFont.systemFontOfSize(16)

        label.textAlignment = .Center

        return label
    }()

存储型属性 & 计算型属性

  • 存储型属性 - 需要开辟空间,以存储数据
  • 计算型属性 - 执行函数返回其他内存地址

  • 只实现 getter 方法的属性被称为计算型属性,等同于 OC 中的 ReadOnly 属性

  • 计算型属性本身不占用内存空间
  • 不可以给计算型属性设置数值
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值