arrays - 是否可以在 Swift 中创建一个仅限于一个类的数组扩展?

标签 arrays swift ios8

我可以做一个只适用于字符串的数组扩展吗?

最佳答案

从 Swift 2 开始,这现在可以通过协议(protocol)扩展来实现, 它为符合类型提供方法和属性实现 (可选地受其他约束限制)。

一个简单的例子:为所有符合的类型定义一个方法 到 SequenceType(例如 Array),其中序列元素是 String:

extension SequenceType where Generator.Element == String {
    func joined() -> String {
        return "".join(self)
    }
}

let a = ["foo", "bar"].joined()
print(a) // foobar

不能直接为struct Array定义扩展方法,只能为所有类型定义 符合某些协议(protocol)(具有可选约束)。所以一个 必须找到 Array 符合并提供所有必要方法的协议(protocol)。在上面的示例中,即 SequenceType

另一个示例(How do I insert an element at the correct position into a sorted array in Swift? 的变体):

extension CollectionType where Generator.Element : Comparable, Index : RandomAccessIndexType {
    typealias T = Generator.Element
    func insertionIndexOf(elem: T) -> Index {
        var lo = self.startIndex
        var hi = self.endIndex
        while lo != hi {
            // mid = lo + (hi - 1 - lo)/2
            let mid = lo.advancedBy(lo.distanceTo(hi.predecessor())/2)
            if self[mid] < elem {
                lo = mid + 1
            } else if elem < self[mid] {
                hi = mid
            } else {
                return mid // found at position `mid`
            }
        }
        return lo // not found, would be inserted at position `lo`
    }
}

let ar = [1, 3, 5, 7]
let pos = ar.insertionIndexOf(6)
print(pos) // 3

这里的方法被定义为 CollectionType 的扩展,因为 需要对元素进行下标访问,并且元素是 必须是 Comparable

关于arrays - 是否可以在 Swift 中创建一个仅限于一个类的数组扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27350941/

相关文章:

ios - 如何在 Swift 中将日期选择器添加到 UIAlertController(UIAlertView)?

ios - 在通过 WiFi 连接的两个或多个设备之间通话 - iOS

ios - 在 xcode 6 中为 ios 8 启动图像

javascript - 数组是否作为 JavaScript ECMAScript 兼容中的左值?

Javascript 高级 console.log

java - 井字棋板二维阵列

ios - 如何创建一个有多个 Collection View 的屏幕,一个在另一个下面?

javascript - 对象内的多维数组

swift - addSnapshotListener 快速 Firestore 行为

uiscrollview - UITextView 在 iOS 8 中隐藏键盘时滚动到顶部