1
我有一個泛型類型,我想用不同的方式初始化它,具體取決於實際類型是否爲Optional
。是否有可能創建一個擴展到一個泛型類型限制爲該類型是可選的,在Swift中?
struct Foo<Bar> {
var value: Bar
}
extension Foo {
init(data: Any) throws {
if let typedData: Bar = data as? Bar {
self.value = typedData
}
else {
throw NSError(domain: "", code: 0, userInfo: nil)
}
}
}
// (invalid restriction)
extension Foo where Bar: Optional<Bar> {
init(data: Any) throws {
if (data as? NSNull) == nil {
if let typedData: Bar = data as? Bar {
self.value = typedData
}
else {
throw NSError(domain: "", code: 0, userInfo: nil)
}
}
else {
self.value = nil
}
}
}
的想法是,我從一些不知名的數據類型的要麼正確初始化,如果該類型對應,否則拋出一個錯誤,但如果NSNull
相當於nil
值,如果類型爲Optional
初始化。
let nonOptionalData: Any = Bar()
// should be successful
let foo1: Foo<Bar> = try Foo(data: nonOptionalData)
let nonOptionalIncorrectData: Any = NSNull()
// should throw an error
let foo2: Foo<Bar> = try Foo(data: nonOptionalIncorrectData)
let optionalData: Any = Bar()
// should be successful
let foo3: Foo<Bar?> = try Foo(data: optionalData)
let optionalIncorrectData: Any = Bob()
// should throw an error
let foo4: Foo<Bar?> = try Foo(data: optionalIncorrectData)
let optionalNullData: Any = NSNull()
// should be successful
let foo5: Foo<Bar?> = try Foo(data: optionalNullData)
有誰知道這是可能的(上面的代碼會失敗,因爲我們不能限制擴展到Optional
型),如果是這樣,怎麼可以做什麼?