我是否可以制作仅适用于字符串的Array扩展?

最佳答案

从Swift 2开始,这可以通过协议扩展来实现,
提供符合标准类型的方法和属性实现
(可选地受附加约束)。

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

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

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

扩展方法不能直接为struct Array定义,而只能为所有类型定义
符合某些协议(具有可选约束)。所以一个
必须找到Array符合的协议,并提供所有必要的方法。在上面的示例中,即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中进行仅限于一类的Array扩展?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30794827/

10-11 22:14
查看更多