昨天提到了protocol,今天我們就學習一下extenison的用法,昨天我們可以透協定去規範我們的struct或者class等等,我們可以透過將protocol跟extension的結合,去實現swift裡面原本不能做到的事情譬如整數跟小數相除。
import UIKit
protocol Number {
var doubleValue: Double { get }
}
extension Double: Number {
var doubleValue: Double {
return self
}
}
extension Int: Number {
var doubleValue: Double {
return Double(self)
}
}
func *(lhs: Number, rhs: Number) -> Double { //乘法
return lhs.doubleValue * rhs.doubleValue
}
func /(lhs: Number, rhs: Number) -> Double { //除法
return lhs.doubleValue / rhs.doubleValue
}
let floatNumber: Double = 5.5
let doubleNumber: Int = 2
let resultNumber = floatNumber / doubleNumber
print(resultNumber)
當然你如果你的型態是其他的話,我們只需要新增額外的extension,譬如你的型態是float
extension Float: Number {
var doubleValue: Double {
return Double(self)
}
}
或是你要做加法除法
func +(lhs: Number, rhs: Number) -> Double { //加法
return lhs.doubleValue + rhs.doubleValue
}
func -(lhs: Number, rhs: Number) -> Double { //減法
return lhs.doubleValue - rhs.doubleValue
}
當然我們也可以結合之前的protocol
protocol ShowID {
func showId()
}
extension ShowID {
func showId () {
print("1234")
}
}
protocol ShowUserName {
func showUserName()
}
extension ShowUserName {
func showUserName() {
print("allen")
}
}
class User1: ShowID ,ShowUserName { }
let allen = User1()
allen.showUserName()
allen.showId()
我們可以讓class去繼承上面的protocol,再透過extenison的方法,寫說我們協定要幹嘛,這樣做的原因是,我的類別可能需要繼承兩個父類別,但是我們沒辦法做到同時繼承兩個父類別,我就可以透過使用extension的方式去實現它