Swift从0开始学习 对象和类 day3

  • 类(Class) 是一种类型或模板,描述了对象的特征和行为。
  • 对象(Object) 是类的实例,实际的实体,拥有自己的数据。

新入门的教学都喜欢用"人"来举例为类,在这里我也用"人"吧

Swift 复制代码
//"人"这个类
class person {
    let type = "person"
    
    var name : String?
    var age : Int?
    
    func setName(name : String) -> String {
        self.name = name
        return "成功设置名字为\(name)"
    }
    
    func eat() {
        print("吃饭行为")
    }
    
    func sleep() {
        print("睡觉行为")
    }
}

//对象(实例)
//人的实例就具体一个人嘛,就let,总不能你还能设置为别人对吧
let you : person = person()
//名字设置为帅哥
you.setName(name: "帅哥")

这里使用person()来实例化,但是如果需要自定义呢,比如初始化的时候需要传点参数对吧,这时候就需要构造函数。

Swift 复制代码
//"人"这个类
class person {
    let type = "person"
    
    var name : String
    var age : Int
    
    //参数的默认值就是帅哥、18
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    
    func setName(name : String) -> String {
        self.name = name
        return "成功设置名字为\(name)"
    }
    
    func eat() {
        print("吃饭行为")
    }
    
    func sleep() {
        print("睡觉行为")
    }
}

//对象
let you : person = person(name: "帅哥", age: 18)
print("你是\(you.name),年龄\(you.age)")
//输出:你是帅哥,年龄18

如果需要某个属性初始化就自带默认值 的话,以身高tall为例,人均180。示例如下:

Swift 复制代码
//"人"这个类
class person {
    let type = "person"
    
    var name : String
    var age : Int
    var tall : CGFloat?
    
    //参数的默认值就是帅哥、18
    init(name: String, age: Int, tall: CGFloat? = 180.0) {
        self.name = name
        self.age = age
        self.tall = tall
    }
    
    func setName(name : String) -> String {
        self.name = name
        return "成功设置名字为\(name)"
    }
    
    func eat() {
        print("吃饭行为")
    }
    
    func sleep() {
        print("睡觉行为")
    }
}

//对象
let you : person = person(name: "帅哥", age: 18)
print("你是\(you.name),年龄\(you.age)," + "身高\(you.tall ?? 0.0)")
//输出:你是帅哥,年龄18,身高180.0

但是有些人行为是不一样的,通过实现person的子类来定义这些不一样的人。

Swift 复制代码
class SpecialMan: person {
    override func eat() {
        print("顿顿帝王蟹")
    }
    
    override func sleep() {
        print("打坐不睡觉")
    }
}

let you = SpecialMan()
you.eat()
//打印"顿顿帝王蟹"

子类如果要重写父类的方法的话,需要用**override 标记** ------如果没有添加 override 就重写父类方法的话编译器会报错。编译器同样会检测 override 标记的方法是否确实在父类中。

同时对应类中的属性getter,setter方法也要会自定义。使用 getter 和 setter 的计算属性。示例:

Swift 复制代码
class SquareShape {
    var sideLength: Double = 0.0 //边长
    var name : String
    
    init(sideLength: Double, name: String) {
        self.sideLength = sideLength
        self.name = name
    }
    
    //周长的get和set的方法
    var perimeter: Double {
        get {
            return 4.0 * sideLength
        }
        set {
            sideLength = newValue / 4.0
        }
    }
}

//初始化边长为8的正方形
var square = SquareShape(sideLength: 8, name: "正方形")
print(square.perimeter)//打印32
//周长设置为16
square.perimeter = 16
print(square.sideLength)//打印4
相关推荐
2501_916007476 小时前
抓包工具功能对比,TraceEagle、Charles、Fiddler、Wireshark、mitmproxy 差别
前端·网络协议·ios·adb·https·fiddler·wireshark
青峰讲运维9 小时前
OpenStack 存储深度解析|Cinder 块存储 + Swift 对象存储原理与完整实操(Yoga)
开发语言·openstack·swift
2501_9151063210 小时前
Windows 上开发 Unity iOS,使用 KXBuild 进行真机调试、性能采样与打包 ipa
windows·vscode·unity·ios·个人开发·swift·敏捷流程
柚鸥ASO优化12 小时前
iOS 27.2 更新后,App Store 广告展示逻辑出现新变化
ios
美狐美颜SDK开放平台13 小时前
视频美颜SDK如何应对快速转头与大幅度面部动作?
android·人工智能·ios·音视频·直播美颜sdk·视频美颜sdk
茶底世界之下14 小时前
秋叶已经够黄了:用 Awaking 单独收一点黄色
ios
Jewel10514 小时前
文字为什么总是不居中!记录一个bug
android·flutter·ios
老李IT笔记16 小时前
抹除和升系统可以合成一条命令了:强制更新夹在抹除里怎么用,什么情况下不该用
ios·智能手机
zhongben123_1 天前
从零开发一个打车APP:技术选型、系统架构与成本评估指南
大数据·运维·ios·系统架构·uni-app·web app
茶底世界之下1 天前
人像清晰度加多少?用 Awaking 对照皮肤与发丝
ios