![](/img/trans.png)
[英]objc[29733]: Swift class extensions and categories on Swift classes are not allowed to have +load methods xcode 10.2 running on ios 12.2
[英]Odd Generics & Optional Behavior in Swift 4.2 after upgrading to iOS 12.2 (Xcode 10.2)
我們剛剛將Xcode更新為10.2(因此是iOS 12.2 SDK),並開始看到有關Swift Generics
和Optionals
行為的奇怪行為。 我們將Swift版本保持在4.2,因此沒有Swift 5更新。 唯一的變化是從Xcode 10.1更新到Xcode 10.2。
這是一個示例代碼,用於說明奇怪之處。 評論顯示版本之間發生了哪些變化。 理想情況下,不應該有任何變化。
class Phone<T> {}
extension Phone {
class func create(initial: T? = nil) -> Phone<T> {
if let _ = initial { print("Regular: Unwrapping worked.") }
return Phone()
}
}
extension Phone where T == Void {
class func create(initial: T? = nil) -> Phone<T> {
if let _ = initial { print("T == Void: Unwrapping worked.") }
return Phone()
}
}
var phone: Phone<Int?> = Phone()
var phone2: Phone<Int?> = Phone()
var phone3: Phone<Int?> = Phone()
// unwrapping works iOS 12.1, doesn't work in 12.2
phone = Phone.create(initial: Optional(nil))
// unwrapping works iOS 12.1, doesn't work in 12.2
phone2 = Phone.create(initial: Optional<Int?>(nil))
// doesn't compile in iOS 12.1, unwrapping works in iOS 12.2
phone3 = Phone.create(initial: Optional<Int>(nil))
// doesn't compile in iOS 12.1, unwrapping doesn't work in 12.2 (uses the T == Void function)
let phone4 = Phone.create(initial: Optional(nil))
我們已經閱讀了Xcode 10.2的發行說明,但沒有發現Optionals或Generics的任何變化。 很難理解導致版本之間行為發生這種變化的原因。
phone2
和phone3
表現方式特別有趣。 上面的代碼示例中發生了一些奇怪的事情,所以問題是,是否有人知道在此版本中可能導致行為更改的原因是什么?
這是由於SE-0213:通過強制進行文字初始化,這意味着編譯器現在將Optional(nil)
視為nil as Optional
。 以前使用Optional(nil)
,你會得到一個包裹的 nil
值,例如Int??.some(nil)
,但現在你得到的只是nil
。
所以對於以下內容:
let phone: Phone<Int?> = Phone.create(initial: Optional(nil))
編譯器將其視為:
let phone: Phone<Int?> = Phone.create(initial: nil as Optional)
這相當於:
let phone: Phone<Int?> = Phone.create(initial: nil)
因為您已將通用參數T
指定為Int?
, initial:
參數需要一個Int??
。 因此,通過傳遞nil
你傳遞Int??.none
,因此解包失敗。
恢復舊行為的一種方法是明確指定.init
以強制編譯器調用初始化器:
let phone: Phone<Int?> = Phone.create(initial: Optional.init(nil))
現在你傳遞一個Int??.some(nil)
到參數並且解包成功。
但是我會問你為什么要首先處理雙重包裝的選項 - 除非絕對必要,否則我強烈建議你避免使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.