我的目标是写一些可以转换类似 [AnyObject]
的东西至Result<[SomeObject], NSError>
在使用混合 Swift/Obj-C 代码库时轻松进行安全且可链接的转换。条件向下转型运算符as?
似乎支持这一点很好,但我无法得到一个利用该行为的通用函数。我将遇到的问题简化如下:
class A { }
let obj = A()
let array: [AnyObject] = [obj]
func cast<T, U>(x: T, type: U.Type) -> U? {
if let x = x as? U {
return x
} else {
return nil
}
}
// This works
if let array = array as? [A] {
println(array)
}
// This works
println(cast(obj, A.self))
// This doesn't
println(cast(array, [A].self))
最佳答案
注意:这适用于 Swift 2.0,我不知道 1.2,尝试一下
如果您想做这样的事情,您必须使用 SequenceType
重载您的 cast
方法:
func cast<T : SequenceType, U : SequenceType>(x: T, type: U.Type) -> [U.Generator.Element]? {
let y = x.map{ $0 as? U.Generator.Element }
if y.contains({ $0 == nil }) {
return nil
} else {
return y.flatMap{ $0 } // Swift 1.2 : y.map{ $0! }
}
}
编辑:根据您的编辑进行更改
关于swift - 如何在 Swift 中编写通用函数来进行条件向下转型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32321515/