Swift基础学习笔记(关于类)-程序员宅基地

技术标签: Swift学习笔记  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 属性

  • 计算型属性本身不占用内存空间
  • 不可以给计算型属性设置数值
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/simapierce/article/details/50782712

智能推荐

分享三种计算机专业毕业设计模板附下载地址_计算机系统毕业设计模板-程序员宅基地

文章浏览阅读599次。一、web管理类计算机专业毕业设计模板 网络的快速发展,系统管理工作也显得尤为重要,信息管理随着科学化的发展达到了存储量大,速度快,完善等特点,管理工作得到发展并促进信息管理,信息化统一管理被更多的用户所接受。互联网技术的提升给人们的生活带来日新月异的变化,信息化潮流使得更多的人们选择上网来充实自我以及实现其他更便捷的服务。时代的进步,各种智能化管理也越来越普及,随着校园生活的不断丰富,校园内各项事务也在不断增加,因此,要开发一个可以高效率,低成本的高校师生信息管理系统,不仅便于校园管理员的统一管理,还可以_计算机系统毕业设计模板

java毕业设计城市出行行程智能推荐系统Mybatis+系统+数据库+调试部署-程序员宅基地

文章浏览阅读81次。?java毕业设计城市出行行程智能推荐系统Mybatis+系统+数据库+调试部署。前端技术:Layui、HTML、CSS、JS、JQuery等技术。springboot基于SpringBoot的桦木加工厂管理系统。springboot基于web的数码产品应用平台设计与实现。ssm基于Java的幼儿早教系统软件的设计与实现。springboot多维分类的知识管理系统。springboot学生网上请假系统。

关于Android 11检测当前是否处于耳机或者蓝牙状态_android 判断当前是否连接耳机-程序员宅基地

文章浏览阅读875次,点赞14次,收藏20次。关于Android 11 设备对当前耳机状态以及蓝牙A2DP状态的判别_android 判断当前是否连接耳机

linux双括号用法,linux shell (()) 双括号运算符使用-程序员宅基地

文章浏览阅读359次。估计很多朋友都感觉比较难以接受。特变逻辑运算符”[]”使用时候,必须保证运算符与算数 之间有空格。 四则运算也只能借助:let,expr等命令完成。 今天讲的双括号”(())”结构语句,就是对shell中算数及赋值运算的扩展。使用方法:语法:((表达式1,表达式2…))特点:1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等。2、在双括号结构中,所有变量可以不加入:“$”符号前缀...

HbuilderX正式版在pages.json中不提示图片路径_hbuilder路径没提示-程序员宅基地

文章浏览阅读677次,点赞8次,收藏9次。HbuilderX正式版在pages.json中不提示图片路径_hbuilder路径没提示

机器学习(ML)在钙钛矿中的实践与应用_基于机器学习探索钙钛矿材料及其应用-程序员宅基地

文章浏览阅读1.8k次。机器学习作为一种兼顾开发效率以及开发成本的方法,已经逐渐应用于材料发现、结构分析、性质预测、反向设计等多个领域,并且在材料学研究中展现出惊人的潜力。以往被广泛使用的经验试错法与计算模拟法因其效率低以及花费高等劣势,已经不能很好的适应如今需求量激增的材料学领域机器学习因其强大的数据处理能力和相对较低的研究门槛,能够有效地降低工业开发中的人力物力成本,缩短研发周期。代替或配合传统的实验以及计算模拟,能够更加快速且准确的分析材料结构、预测材料性质,从而更加有效的开发新的功能材料。机器学习已在材_基于机器学习探索钙钛矿材料及其应用

随便推点

Python 生成器\迭代器_python生成器迭代器-程序员宅基地

文章浏览阅读142次。Python 生成器\迭代器一、什么是生成器?通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list..._python生成器迭代器

Android 10 安装Apk加限制(需要密码)_安装apk时需要输入密码,例如12345,才能安装成功,否则安装失败-程序员宅基地

文章浏览阅读1.3k次。需求:安装APK时需要输入密码,例如12345,才能安装成功,否则安装失败。_安装apk时需要输入密码,例如12345,才能安装成功,否则安装失败

【笔记】SemGCN-程序员宅基地

文章浏览阅读938次。【笔记】SemGCN_semgcn

自我觉察-3:发现-我这么做究竟为了什么?-程序员宅基地

文章浏览阅读181次。  今天一个人在食堂吃饭时,不是很饿,又拿了很多菜,就挑挑拣拣的吃,然后呢,又觉得吃相不雅,让别人看了不好。就有点儿端着架子吃似的。这时候,我突然想起一句话“我用自认为优雅地姿势吃饭为了什么”。是为了给别人留下好印象吗,为了不让别人说我吃相太难看吗。我这样的想法,不是在讨好别人吗,为了别人的感觉而生活吗,去外界寻求对自己的肯定进而才会肯定自己吗?端坐椅子,背挺直,细嚼慢咽,用左手,要求自己是这样的..._我这么做究为了什么

org.springframework.util.ObjectUtils-程序员宅基地

文章浏览阅读4次。org.springframework.util.ObjectUtils获取对象的基本信息:String str = null;// 获取对象的类名。参数为 null 时,返回字符串:"null"String s = ObjectUtils.nullSafeClassName(str);System.out.println(s);// null// 参数为 null 时,返回 0...

括号匹配 PTA C++/C(栈)_pta括号匹配-程序员宅基地

文章浏览阅读551次。给定一串字符,不超过100个字符,可能包括括号、数字、字母、标点符号、空格,编程检查这一串字符中的( ) ,[ ],{ }是否匹配。_pta括号匹配