我可以创建一个适用于例如字符串的数组扩展吗?
从
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的扩展,因为需要下标访问元素,元素是要求是可比较的.