swift - 如何在 Swift 中编写通用函数来进行条件向下转型?

标签 swift generics functional-programming

我的目标是写一些可以转换类似 [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/

相关文章:

javascript - 将函数应用于对象树中属性的所有实例

functional-programming - 为什么产品比记录使用更多的内存?

ios - 全局将 UIImageView 添加到 UINavigationBar 而不是标题

swift - map 在 Swift2 iOS9 中第一次不读取代码

iOS:同时使用 Facebook 和 Google,Google Plus 登录

generics - 如何在 Elixir 中类型指定泛型

java - 在 HashMap 中使用嵌套泛型类型

java - 整数参数不同,但比较时结果仍然是对象相等?我哪里做错了?

swift - Swift 中的 Guard 声明

javascript - 我可以使用一组限制来模拟 JavaScript 中的函数式编程吗?