Swift3.0 - 真的很簡單
Swift3.0 - 數據類型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可選值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 對象和類
Swift3.0 - 屬性
Swift3.0 - 函數和閉包
Swift3.0 - 初始化和釋放
Swift3.0 - 協議protocol
Swift3.0 - 類和結構體的區別
Swift3.0 - 枚舉
Swift3.0 - 擴展
Swift3.0 - 下標
Swift3.0 - 泛型
Swift3.0 - 異常錯誤
Swift3.0 - 斷言
Swift3.0 - 自動引用計數(strong,weak,unowned)
Swift3.0 - 檢測API
Swift3.0 - 對象的標識
Swift3.0 - 注釋
Swift3.0 - 元類型
Swift3.0 - 空間命名
Swift3.0 - 對象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 類簇
Swift3.0 - 動態調用對象(實例)方法
Swift3.0 - 文本輸出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 鏡像
Swift3.0 - 遇到的坑
- 如何實現對象拷貝
第一種方法:
1.遵守協議 NSCopying
2.實現協議
NSCopying 協議
public protocol NSCopying {
public func copy(with zone: NSZone? = nil) -> Any
}
示例代碼:
class Student:NSCopying {
var name: String
required init(name:String){
self.name = name
}
func copy(with zone: NSZone? = nil) -> Any {
let student = Student(name: self.name)
return student
}
}
// 使用
let student1 = Student(name: "XUJIE")
let student2:Student = student1.copy() as! Student
student2.name = "酷走天涯"
print(student1.name)
print(student2.name)
運行:
XUJIE
酷走天涯
分析:
由于NSCopying 協議里面的方法copy 返回的值為Any 系統沒法推斷出來是Student 類型,所以必須 as! 指明是Student 類型 過程有點繁瑣
- 第二種方法
1.創建一個一個required 修飾的初始化方法
2.自定義一個copy方法
示例代碼
class Student{
var name: String
required init(name:String){
self.name = name
}
func copy() -> Self {
let result = type(of: self).init(name:self.name)
return result
}
}
// 使用
let student1 = Student(name: "XUJIE")
let student2 = student1.copy()
student2.name = "酷走天涯"
print(student1.name)
print(student2.name)
運行結果:
XUJIE
酷走天涯
分析:
type(of: self) 獲取到自身類的類型,然后通過init(name:self.name) 初始化一個對象 ,初始化的對象為Self 類型
思考:初始化為什么要使用required 修飾的的初始化
參考元類型
設計規范:
像拷貝這種行為, 不是很多對象都具有的行為,我們應該把它設計成協議,讓類去繼承它
protocol Copy{
func copy() -> Self
}
其實如果我們但從技術上實現, 下面的方式也可以的
func copy() -> Student{
let result = Student.self.init(name:self.name)
return result
}
func copy() -> Student{
let result = Student.init(name: self.name)
return result
}
func copy() -> Student{
let result = Student(name: self.name)
return result
}
- 給多個對象擴展相同的方法
需求: 給數字擴展一個返回平方的操作
// 定義個協議
protocol NumberProtocol{
}
// 擴展實現協議
extension Int:NumberProtocol{
}
extension Double:NumberProtocol{
}
// 給協議擴展方法
extension NumberProtocol{
// 我們不確定返回的Self 到底是什么類型
func squareValue()-> Self{
if self is Int{
let n = self as! Int
return n * n as! Self
}
if self is Double{
let n = self as! Double
return n * n as! Self
}
return 0 as! Self
}
}
print(3.44.squareValue())
print(3.squareValue())
如果您有更多思路,請交流探討。