簡體   English   中英

將可選類型轉換為非可選類型

[英]Convert an optional Type to non-optional Type

以下代碼引發編譯錯誤:

import UIKit

class Initable {
    required init() {}
}

class NestedObject:Initable {
    var nestedProp:String? = nil
}

class MyObj {
    var name:String? = nil
    var value:Int? = nil
    var otherVals:[String]? = nil
    var nestedObj:NestedObject? = nil
}

let obj = MyObj()
var nestedObj = obj[keyPath: \MyObj.nestedObj]
if(nestedObj == nil) {
    nestedObj = type(of: obj[keyPath: \MyObj.nestedObj]).init()
}
nestedObj![keyPath: \NestedObject.nestedProp] = "NEST ME BABY!!"
obj[keyPath: \MyObj.nestedObj] = nestedObj!

obj

這是因為type(of: obj[keyPath: \MyObj.nestedObj])NestedObject? ,當然不能初始化。 我需要一種方法來解開可選類型並獲取非可選類型NestedObject

必須維持的假設。

  • 我必須使用可選項,因為nestedObj有可能為零。
  • 我不知道NestedObject的類型是什么。 它可以是任何類型,但我確信這些類型都是Initable
  • 我需要能夠通過 keypath 設置我的nestedObject的屬性。
  • 如果nestedObject為nil,我需要創建一個新的NestedObject並通過keypath 設置值。

這是較大系統的一小部分,因此必須考慮上述假設。 我無法改變那些。

您可以使用可選的Wrapped類型來初始化嵌套的 object:

let obj = MyObj()
let nestedObj = type(of: obj[keyPath: \MyObj.nestedObj]).Wrapped()
nestedObj[keyPath: \NestedObject.nestedProp] = "NEST ME BABY!!"

print(nestedObj.nestedProp ?? "")  // "NEST ME BABY!!"

如果您希望生成的 object 也是可選的:

let obj = MyObj()
var nestedObj = obj[keyPath: \MyObj.nestedObj]
if nestedObj == nil {
    nestedObj = type(of: obj[keyPath: \MyObj.nestedObj]).Wrapped()
}
nestedObj?[keyPath: \NestedObject.nestedProp] = "NEST ME BABY!!"

您需要添加這些助手:

protocol AnyOptional {
    associatedtype Wrapped
    var optional: Optional<Wrapped> { get }
}

extension Optional: AnyOptional {
    var optional: Optional<Wrapped> { self }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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