今天我們來介紹 Swift 裡一個超實用的功能 — extension
擴展!
在寫程式的過程中, 你可能會遇到一個情況:
「我想幫一個已經寫好的型別,加上一些我自己想要的方法或功能,但又不想去改原本的程式碼!」
這時候 extension
就是你的救星啦!
它可以幫助我們:
extension 型別名稱 {
// 新增的方法、計算屬性等等
}
我們來幫 String
這個型別加上一個方法,可以回傳它是不是一種水果名稱。
extension String {
func isFruit() -> Bool {
let fruits = ["apple", "banana", "grape", "orange"]
return fruits.contains(self.lowercased())
}
}
// 使用範例
let name1 = "apple"
let name2 = "car"
print(name1.isFruit()) // true
print(name2.isFruit()) // false
這樣一來,不管什麼字串,你都可以直接 .isFruit()
來判斷它是不是水果,超方便!
除了上面的例子,你還可以新增任何自訂功能:
extension Int {
func toFruitPrice() -> String {
return "\(self) 元"
}
}
let applePrice = 10
print(applePrice.toFruitPrice()) // "10 元"
使用方法就是 變數名.func名
你可以幫型別加上計算屬性(注意:不能新增儲存屬性)
extension Double {
var half: Double {
return self / 2
}
}
let price = 20.0
print(price.half) // 10.0
假設我們有一個 Fruit
struct,可以用 extension
把功能分成多個區塊。
struct Fruit {
var name: String
var price: Int
}
// 基本描述功能
extension Fruit {
func description() -> String {
return "\(name) 價格是 \(price) 元"
}
}
// 價格判斷功能
extension Fruit {
func isExpensive() -> Bool {
return price > 50
}
}
let banana = Fruit(name: "香蕉", price: 60)
print(banana.description()) // "香蕉 價格是 60 元"
print(banana.isExpensive()) // true
extension
不能新增儲存屬性(只能新增方法、計算屬性、便利初始化器等)。String
、Int
、Array
)或自訂型別。extension
就像是在現有的程式碼外面「加掛外掛」,不用動原本的程式碼,就能讓它變得更強大。
它的常見用途包含 新增方法、計算屬性、分類功能、協議實作 等等。