当前位置: 首页 > article >正文

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

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

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

//"人“这个类
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()来实例化,但是如果需要自定义呢,比如初始化的时候需要传点参数对吧,这时候就需要构造函数。
 

//"人“这个类
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。示例如下:
 


//"人“这个类
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的子类来定义这些不一样的人。

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

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

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

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

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


http://www.kler.cn/a/402084.html

相关文章:

  • Linux进阶:压缩、解压
  • 百度AI人脸检测与对比
  • Debezium-EmbeddedEngine
  • 《网络风险及网络安全》培训总结
  • 【多状态dp】买卖股票的最佳时机III
  • 【Linux】基础02
  • IDEA leetcode插件代码模板配置,登录闪退解决
  • 腾讯云软件源加速软件包下载安装和更新
  • 【FMC169】基于VITA57.1标准的4发4收射频子模块(基于ADRV9026)
  • ITSS服务经理: 山西科技学院智能铸造现代产业学院揭牌
  • 矩阵起源入选IDC《RAG与向量数据库市场前景预测》报告
  • ThinkPHP6的缓存机制
  • 线性数据结构
  • linux常用命令(文件操作)
  • windows C#-异步编程场景(一)
  • 【前端知识】Javascript前端框架Vue入门
  • 代码随想录算法训练营第五十一天|Day51 图论
  • 基于机器学习电信号EMG训练分类模型控制仿生手控制系统(Matlab-Simulink实现)
  • 使用Axios函数库进行网络请求的使用指南
  • 在spring boot工程中使用Filter时,@WebFilter 注解不生效的问题分析和解决方案
  • OSPF的练习
  • Github 2024-11-16Rust开源项目日报 Top10
  • golang操作mysql基础驱动github.com/go-sql-driver/mysql使用
  • A - 123233(atCoder-380刷题笔记)
  • WebView2的踩坑记
  • Pr:音频过渡