arrays - 如何在 Swift 中扩展类型化数组?

标签 arrays swift

我如何扩展 Swift 的 Array<T>T[]使用自定义功能实用程序键入?

浏览 Swift 的 API 文档表明数组方法是 T[] 的扩展。 ,例如:

extension T[] : ArrayType {
    //...
    init()

    var count: Int { get }

    var capacity: Int { get }

    var isEmpty: Bool { get }

    func copy() -> T[]
}

当复制和粘贴相同的源并尝试任何变体时,例如:

extension T[] : ArrayType {
    func foo(){}
}

extension T[] {
    func foo(){}
}

构建失败并出现错误:

Nominal type T[] can't be extended

使用完整类型定义失败并返回 Use of undefined type 'T' ,即:

extension Array<T> {
    func foo(){}
}

它也失败了 Array<T : Any>Array<String> .

奇怪的是,Swift 允许我扩展一个无类型数组:

extension Array {
    func each(fn: (Any) -> ()) {
        for i in self {
            fn(i)
        }
    }
}

它让我可以调用:

[1,2,3].each(println)

但我无法创建适当的通用类型扩展,因为类型在流经该方法时似乎丢失了,例如尝试 replace Swift's built-in filter with :

extension Array {
    func find<T>(fn: (T) -> Bool) -> T[] {
        var to = T[]()
        for x in self {
            let t = x as T
            if fn(t) {
                to += t
            }
        }
        return to
    }
}

但是编译器将其视为无类型的,它仍然允许使用以下方式调用扩展:

["A","B","C"].find { $0 > "A" }

当使用调试器逐步执行时,表明类型是 Swift.String但是尝试像 String 一样访问它而不将其转换为 String 是构建错误首先,即:

["A","B","C"].find { ($0 as String).compare("A") > 0 }

有谁知道创建类似于内置扩展的类型化扩展方法的正确方法是什么?

最佳答案

为了使用 扩展类型化数组,下面的代码对我有用(Swift 2.2)。例如,对类型化数组进行排序:

class HighScoreEntry {
    let score:Int
}

extension Array where Element == HighScoreEntry {
    func sort() -> [HighScoreEntry] {
      return sort { $0.score < $1.score }
    }
}

尝试使用 structtypealias 执行此操作会报错:

Type 'Element' constrained to a non-protocol type 'HighScoreEntry'

更新:

要使用非类扩展类型化数组,请使用以下方法:

typealias HighScoreEntry = (Int)

extension SequenceType where Generator.Element == HighScoreEntry {
    func sort() -> [HighScoreEntry] {
      return sort { $0 < $1 }
    }
}

Swift 3 中,某些类型已重命名:

extension Sequence where Iterator.Element == HighScoreEntry 
{
    // ...
}

关于arrays - 如何在 Swift 中扩展类型化数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24027116/

相关文章:

javascript - 使用 Javascript .find() 似乎在做一些奇怪的强制我似乎无法查明

jquery - 如何使用 jQuery 获取数组键?

c# - System.Array 不包含 'Any' 的定义 - C#

ios - 访问 Realms 对象列表时出错 : Realm accessed from incorrect thread

swift - 在沙盒 macOS 应用程序的 ApplicationScripts 目录中创建文件

swift - 通过 HTTP 发送 `NSManagedObjects`

java - 碰撞检测和 react java

java - 我该如何洗牌?如何制作字符串数组构造函数?

swift - 在 Swift 中获取字符串的第 n 个字符

ios - 使用NotificationCenter的加载器