Swift3.0 - 真的很簡(jiǎn)單
Swift3.0 - 數(shù)據(jù)類型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可選值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 對(duì)象和類
Swift3.0 - 屬性
Swift3.0 - 函數(shù)和閉包
Swift3.0 - 初始化和釋放
Swift3.0 - 協(xié)議protocol
Swift3.0 - 類和結(jié)構(gòu)體的區(qū)別
Swift3.0 - 枚舉
Swift3.0 - 擴(kuò)展
Swift3.0 - 下標(biāo)
Swift3.0 - 泛型
Swift3.0 - 異常錯(cuò)誤
Swift3.0 - 斷言
Swift3.0 - 自動(dòng)引用計(jì)數(shù)(strong,weak,unowned)
Swift3.0 - 檢測(cè)API
Swift3.0 - 對(duì)象的標(biāo)識(shí)
Swift3.0 - 注釋
Swift3.0 - 元類型
Swift3.0 - 空間命名
Swift3.0 - 對(duì)象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 類簇
Swift3.0 - 動(dòng)態(tài)調(diào)用對(duì)象(實(shí)例)方法
Swift3.0 - 文本輸出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 鏡像
Swift3.0 - 遇到的坑
- 如何實(shí)現(xiàn)對(duì)象拷貝
第一種方法:
1.遵守協(xié)議 NSCopying
2.實(shí)現(xiàn)協(xié)議
NSCopying 協(xié)議
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)
運(yùn)行:
XUJIE
酷走天涯
分析:
由于NSCopying 協(xié)議里面的方法copy 返回的值為Any 系統(tǒng)沒(méi)法推斷出來(lái)是Student 類型,所以必須 as! 指明是Student 類型 過(guò)程有點(diǎn)繁瑣
- 第二種方法
1.創(chuàng)建一個(gè)一個(gè)required 修飾的初始化方法
2.自定義一個(gè)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)
運(yùn)行結(jié)果:
XUJIE
酷走天涯
分析:
type(of: self) 獲取到自身類的類型,然后通過(guò)init(name:self.name) 初始化一個(gè)對(duì)象 ,初始化的對(duì)象為Self 類型
思考:初始化為什么要使用required 修飾的的初始化
參考元類型
設(shè)計(jì)規(guī)范:
像拷貝這種行為, 不是很多對(duì)象都具有的行為,我們應(yīng)該把它設(shè)計(jì)成協(xié)議,讓類去繼承它
protocol Copy{
func copy() -> Self
}
其實(shí)如果我們但從技術(shù)上實(shí)現(xiàn), 下面的方式也可以的
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
}
- 給多個(gè)對(duì)象擴(kuò)展相同的方法
需求: 給數(shù)字?jǐn)U展一個(gè)返回平方的操作
// 定義個(gè)協(xié)議
protocol NumberProtocol{
}
// 擴(kuò)展實(shí)現(xiàn)協(xié)議
extension Int:NumberProtocol{
}
extension Double:NumberProtocol{
}
// 給協(xié)議擴(kuò)展方法
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())
如果您有更多思路,請(qǐng)交流探討。