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
相关推荐
可乐鸡翅yeah_4 小时前
hls.js 切换多个视频源,新手开发常见踩坑
开发语言·前端·javascript·ios·ffmpeg·音视频·safari
传奇开心果编程4 小时前
【Flutter入门练中学】第8课:动画与过渡
android·学习·flutter·ui·ios
传奇开心果编程6 小时前
【Flutter入门练中学】第11课:状态管理进阶与声明式路由
android·学习·flutter·ui·ios
JasonSJX6 小时前
四端自建播放器怎么落地:Android、iOS、tvOS、Tizen 的 DRM 播放 SDK 技术盘点
android·ios·音视频·视频防录屏·加密保护课程·直播安全
茶底世界之下9 小时前
HDR 曲线为什么必须显式决定:端点钳位还是线性外推
ios
茶底世界之下19 小时前
导出进度不是一个百分比:AVFoundation 收尾阶段的状态建模
ios·swift
大熊猫侯佩20 小时前
macOS27 上可变界面尺寸 iOS App 揭秘
macos·ios·swiftui
大熊猫侯佩20 小时前
iPhone Duo 从外屏到内屏:ArrangementView 抢先适配
swiftui·xcode·apple
用户21816970493020 小时前
LLVM
ios
茶底世界之下20 小时前
为什么媒体源不能在回调仍执行时提前报告 finish?
swift