Swift5 属性与方法

1. Swift 存储属性


// Swift5 存储属性
class Phone {var system = "iOS"// 常量存储属性,一旦实例化,不能修改let brand: String// 存储属性,可以修改var price: Int// 当类被实例化时,要保证所有的属性都初始化完成,除非属性有默认值init(brand: String, price: Int) {self.brand = brandself.price = priceprint("brand: \(brand), price: \(price)")}
}// 修改类的属性值
let iPhone = Phone(brand: "iPhone", price: 5999)
iPhone.price -= 600// 延时存储属性:当类初始化时,延时存储属性不被初始化,当被调用时才初始化
class Consumer {var money: Intlazy var phone: Phone = Phone(brand: "iPhone", price: 6999)init(money: Int) {self.money = money}
}// 只初始化了money
var richMan = Consumer(money: 100_000)
// 延时属性 phone 被初始化
print(richMan.phone) // brand: iPhone, price: 6999

2. Swift 计算属性


// Swift5 计算属性
class Android {// 常量存储属性,一旦实例化,不能修改let system: String = "android"// 存储属性var version = "12"// api 级别var apiLevel: String = "31"// 计算属性,向外提供接口访问类实例的某种状态,这种状态和类实例的属性值相关联var info: String {get {return "system: \(system), version: \(version), level: \(apiLevel)"}set {// 默认使用 newValue 指代新值version = newValue.split(separator: "-").first?.description ?? ""apiLevel = newValue.split(separator: "-").last?.description ?? ""}}// 计算属性 价格,简单模拟var price: ClosedRange<Int> {get {// 当版本高于30时,价格在[4000,6999]之间if (apiLevel > "30") {return 4000...6999} else {return 1000...3999}}// 自定义传值名称 newPriceset(newPrice) {// 当价格高于3999时,版本为31if (newPrice.lowerBound > 3999) {apiLevel = "31"version = "12"} else {apiLevel = "30"version = "11"}}}}var newPhone = Android()
print(newPhone.info) // system: android, version: 12, level: 31newPhone.info = "11-30"
print(newPhone.info) // system: android, version: 11, level: 30newPhone.price = 4000...4999
print(newPhone.info) // system: android, version: 12, level: 31

3. Swift 属性监听器


// Swift5 属性监听器
class iOS {var brand: String {// 此属性将要被赋值时会调用,默认带一个 newValue 字段。// 注意:初始化时不会被调用,从第二次赋值时才开始被调用willSet {print("new value : \(newValue)")}// 此属性已经被赋值后会调用,默认带一个 oldValue 字段didSet {print("old value : \(oldValue)")}}var price: Int {// 自定义传值名称willSet(newPrice) {print("new price : \(newPrice)")}// 自定义传值名称didSet(oldPrice) {print("old price : \(oldPrice)")}}init(brand: String, price: Int) {self.brand = brandself.price = priceprint("brand: \(brand), price: \(price)")}
}let newIPhone = iOS(brand: "iphone 12", price: 5999)
newIPhone.brand = "iphone 13"
newIPhone.price = 6999

4. Swift 属性包装器


// Swift5 属性包装器
@propertyWrapper
struct StringNotEmpty {var value: Stringinit() {self.value = "default string"}var wrappedValue: String {get { return value }set {if (newValue.count > 0) {self.value = newValue} else {self.value = "default string"}}}
}class Student: CustomStringConvertible {@StringNotEmptyvar name: Stringvar description: String {return "student's name is \(name)"}
}let student = Student()
student.name = ""
print(student) // student's name is default string

5. Swift 静态属性与静态方法


// Swift5 静态属性与静态方法
class BaseClass {// 静态存储属性static var param = "param"// 静态计算属性static var computeParam: String {return "computeParam"}// 可被继承的静态计算属性class var openParam: String {return "openParam"}// 声明静态方法,即类方法static func method() {print("static method")}// 声明可被继承的静态方法class func openMethod() {print("static openMethod")}
}class SubClass : BaseClass {// 重写父类的 openParam 属性,类似于 Kotlin 的 open 修饰override class var openParam: String {return "SubClass openParam"}override class func openMethod() {print("SubClass openMethod")}
}// 调用静态属性
BaseClass.param
BaseClass.computeParam
BaseClass.openParam
SubClass.openParam// 调用静态方法
BaseClass.method()
BaseClass.openMethod()
SubClass.openMethod()

6. Swift 下标方法


// Swift5 下标方法
// 为自定义的数据类型使用 subscript 定义下标访问元素的方法
class CustomList {var list: Array<String>init(list: String...) {self.list = list}// 定义下标方法subscript(index: Int) -> String {set {list[index] = newValue}// 可以只定义getget {return list[index]}}
}let list = CustomList(list: "1", "2", "3")
list[0] = "item 1"
print(list[1])

GitHub 源码:Property&Method.playground

Swift 属性与方法相关推荐

  1. Swift -- 7.5 类型属性,方法

    在不加特定修饰符的情况下,在swift类型中定义的属性,方法都是属于实例的. 可以使用static来声明枚举和结构体的类型属性/方法 使用class来声明类的类型属性/方法 swift对类型成员和实例 ...

  2. swift 学习- 12 -- 方法

    // 方法 是与某些特定类型相关的函数.  类, 结构体,枚举 都可以定义实例方法, 实例方法为给类型的实例封装了具体的任务与功能.  类, 结构体, 枚举 也可以定义类型方法,  类型方法与类型本身 ...

  3. 【转载】Swift属性Property

    本文系转载 原文链接 Swift的属性与Objective-C中的属性是一样的,不同的是Swift细化了属性的类型,另外除了类之外,结构体和枚举也可以有属性. Swift中有这么几种属性: 存储属性( ...

  4. swift面向对象之方法

    swift面向对象之方法 1.下标方法 下标方法仅用于实例,可以在类,结构体,枚举中使用,作用简化类型中的访问方式,注意以下几点 下标方法属于三栖方法,可用于类,结构体和枚举 下标方法的格式为subs ...

  5. 我的Python学习笔记(四):动态添加属性和方法

    一.动态语言相关概念 1.1 动态语言 在运行时代码可以根据某些条件改变自身结构 可以在运行时引进新的函数.对象.甚至代码,可以删除已有的函数等其他结构上的变化 常见的动态语言:Object-C.C# ...

  6. Swift —— 属性

    Swift -- 属性 1. 存储属性 1.1 let 和 var 的区别 代码角度 汇编角度 SIL角度 2. 计算属性 3. 属性观察者 4. 延迟存储属性 5. 类型属性 6. 属性在Mahco ...

  7. python类中的属性分为类属性和实例属性两种_python从入门到大神---1、初始化实例、类属性、方法...

    python从入门到大神---1.初始化实例.类属性.方法 一.总结 一句话总结: 方法不加括号是代码段:感觉python方法和js,php很类似,不加括号是代码段,加括号变成方法,比如f,f() 1 ...

  8. Kotlin 类、属性、方法、继承、多态

    Kotlin 类.属性.方法.继承.多态 一.Kotlin 类 1. kotlin 定义类 使用 open 修饰类,表明可被子类继承 使用 open 修饰属性,表明可被子类覆写 /*** Kotlin ...

  9. adodb.RecordSet的属性和方法

    为了更精确地跟踪数据,要用RecordSet组件创建包括数据的游标,游标就是储存在内存中的数据: rs = Server.CreateObject("ADODB.RecordSet" ...

最新文章

  1. 【BZOJ】3173: [Tjoi2013]最长上升子序列(树状数组)
  2. CORS跨域实现思路及相关解决方案
  3. 如何在本地运行查看github上的开源项目
  4. UA OPTI512R 傅立叶光学导论 采样定理例题
  5. KDD Cup 2021:时间序列异常检测问题开源方案
  6. [转] 哈佛大学研究:一个人成为废物的九大根源
  7. 最新版python如何安装qt5_Python3 搭建Qt5 环境的方法示例
  8. 这个 bug 可劫持同一 WiFi 网络上所有的安卓版火狐移动浏览器
  9. 关于android隐式启动activity的分析和说明,Android学习之Intent中显示意图和隐式意图的用法实例分析...
  10. OpenCV-图像处理(24、直方图计算)
  11. 文档转换工具 —— 你还在为wps的word转pdf上限五页而苦恼吗?
  12. 配置文件(properties类)
  13. 小技巧:两种方式快速实现平滑涂鸦画板
  14. python知识点大全-2
  15. 食品加工行业MES与APS的应用
  16. Kafka 2.8.0 学习
  17. 互联网打印机协议IPP分析
  18. 【Hive】Hive练习题(一)
  19. vue循环请求同一个接口,等接口返回数据之后在进行下次循环
  20. 2022年起重机司机(限桥式起重机)考试题库及答案

热门文章

  1. 对抗训练-smart 论文阅读笔记
  2. 基于MATLAB的批量3度带高斯正算(LB--xy)
  3. Mvtec数据集批量加各种噪声(高斯,椒盐,随机噪声)
  4. 【C语言函数递归】递归计算最大公约数
  5. [ArrayList删除元素] 你需要了解的ArrayList如何安全的删除重复元素/ list去重
  6. 目标定位算法(二)之基于测距的定位算法
  7. php微博毕业论文,php校园微博网站
  8. 计算机考研复试C语言常见面试题
  9. python切换前端的iframe页面_如何切换到iframe窗口?
  10. Android开发之控制手机振动(Vibrator的使用)