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
相关推荐
帅次12 小时前
Android 17 开发者实战:核心更新与应用场景落地指南
android·java·ios·android studio·iphone·android jetpack·webview
人月神话Lee13 小时前
【图像处理】Core Image 与 GPU 渲染管线——让滤镜飞起来
ios·ai编程·图像识别
feifeigo12315 小时前
基于隐马尔可夫模型(HMM)的孤立词语音识别系统
人工智能·语音识别·xcode
sakiko_15 小时前
Swift学习笔记34-MVC架构,SwiftUI与UIkit混编练习
笔记·学习·swiftui·mvc·swift
帅次19 小时前
讯飞与腾讯云:Android 实时语音识别服务对比选择
android·ios·微信小程序·小程序·android studio·android runtime
basketball61621 小时前
Golang:基本输入输出使用方法总结
开发语言·golang·xcode
择势21 小时前
用一套View代码,同时支持RTL和LTR布局混合排版
ios
游戏开发爱好者81 天前
iOS开发工具推荐:Xcode、AppCode、SwiftLint使用心得与效率提升
ide·vscode·macos·ios·个人开发·xcode·敏捷流程
2501_915909061 天前
深入理解HTTPS中间人抓包技术原理与实战指南
网络协议·http·ios·小程序·https·uni-app·iphone
sakiko_1 天前
Swift学习笔记35-本地化
笔记·学习·swift