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
相关推荐
CocoaKier1 小时前
如何安装旧版的MacOS系统?
macos·ios·mac
2501_915106321 小时前
iOS开发之Xcode常用调试技巧总结
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
sakiko_3 小时前
使用SPM(Xcode27), 并解决Package.swift不存在问题
swift
美狐美颜SDK开放平台3 小时前
直播APP平台搭建需要哪些技术?视频美颜SDK只是其中一环
android·ios·音视频·直播美颜sdk·视频美颜sdk
小π军5 小时前
安卓、iOS、鸿蒙三端的理解
android·ios·harmonyos
终端安全笔记6 小时前
声明式之后,怎么证明更新策略真的生效了
ios·iphone
茶底世界之下7 小时前
瀑布的白色需要压住吗?用 Awaking 检查高光调整的边界
ios
TheLittleBoy7 小时前
iOS 27支持的设备列表
macos·ios·cocoa·ios 27
智能相对论7 小时前
STEPX Neo:AI终端的“初代iPhone时刻”
人工智能·ios·iphone
茶底世界之下1 天前
灯塔照片怎么裁竖幅?用 Awaking 留住塔顶,收紧两侧环境
ios