簡體   English   中英

升級到iOS 12.2(Xcode 10.2)后,Swift 4.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 GenericsOptionals行為的奇怪行為。 我們將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的任何變化。 很難理解導致版本之間行為發生這種變化的原因。

phone2phone3表現方式特別有趣。 上面的代碼示例中發生了一些奇怪的事情,所以問題是,是否有人知道在此版本中可能導致行為更改的原因是什么?

這是由於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM