Some existing problems in closure type inference 閉包型別推斷現存的一些問題
運行環境: Swift 5, Xcode 12.5, macOS Big Sur 11.4
宣告閉包時, 建議通過型別注解(type annotation)直接限定指定的型別, 這樣, 編譯器一旦發現型別不匹配, 會直接報錯, 在 swift 中, 應該謹慎使用閉包的自動型別推斷, swift 中閉包的型別推斷存在一定的不確定性, 可能和你預想的型別并不相同.
自動推斷為(SQIClass) -> ()型別
希望自動推斷為(SQIClass) -> Void型別, 結果卻被推斷為(SQIClass) -> ()
class SQIClass {
var clsName: String?
}
// 這里的`block`被自動推斷為`(SQIClass) -> ()`型別, 你想要的型別可能是`(SQIClass) -> Void`, 可以通過下面`print(type(of: block))`的輸出來驗證
let block = { object in
sqiPrintObject(object)
}
func sqiPrintObject(_ object: SQIClass) {
print(object)
}
print(type(of: block))
自動推斷為(SQIClass) -> ()?型別
當閉包中存在可選鏈, 則可能會自動推斷為(SQIClass) -> ()?, 并不是原本想要的(SQIClass) -> Void型別
class SQIClass {
var clsName: String?
}
class SQIPrintClass {
func sqiPrintObject(_ object: SQIClass) {
print(object)
}
func test() {
// 這里的`block`被自動推斷為`(SQIClass) -> ()?`型別, 可以通過下面`print(type(of: block))`的輸出來驗證
let block = { [weak self] object in
self?.sqiPrintObject(object)
}
print(type(of: block))
}
}
自動型別推斷與想要的型別不匹配引起的報錯
當你把(SQIClass) -> ()?型別的閉包賦值給((SQIClass) -> Void)?型別的屬性時, 編譯器會報錯
Cannot assign value of type '(SQIClass) -> ()?' to type '((SQIClass) -> Void)?'
(SQIClass) -> ()?和(SQIClass) -> ()是什么型別
入參為SQIClass型別的物件, 回傳值為空元祖(), 或者可選空元祖()?
解決辦法
型別標注
let block: (SQIClass) -> Void = { object in
// ...
}
let block: (SQIClass) -> Void = { [weak self] object in
self?.someFunctionCall()
}
完整的閉包運算式語法
let block = { object -> Void in
// ...
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/293758.html
標籤:其他
