Is it possible to make an Array extension in Swift that is restricted to one class?

后端 未结 4 767
暖寄归人
暖寄归人 2020-11-27 21:39

Can I make an Array extension that applies to, for instance, just Strings?

4条回答
  •  Happy的楠姐
    2020-11-27 21:39

    As of Swift 2, this can now be achieved with protocol extensions, which provide method and property implementations to conforming types (optionally restricted by additional constraints).

    A simple example: Define a method for all types conforming to SequenceType (such as Array) where the sequence element is a String:

    extension SequenceType where Generator.Element == String {
        func joined() -> String {
            return "".join(self)
        }
    }
    
    let a = ["foo", "bar"].joined()
    print(a) // foobar
    

    The extension method cannot be defined for struct Array directly, but only for all types conforming to some protocol (with optional constraints). So one has to find a protocol to which Array conforms and which provides all the necessary methods. In the above example, that is SequenceType.

    Another example (a variation of 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
    

    Here the method is defined as an extension to CollectionType because subscript access to the elements is needed, and the elements are required to be Comparable.

提交回复
热议问题