在数组扩展中采用相同数组的方法签名

时间:2018-12-25 21:08:33

标签: swift

我想在Array扩展中编写一个通用方法,该方法具有一个参数类型,该参数类型也是一个元素类型相同的数组(对于数组扩展的调用者和参数)。这是我的意思(但它们都不起作用):

extension Array {
    func doSomethingWithAnotherArray(arr: Self) {

    }
}

extension Array {
    func doSomethingWithAnotherArray<T: Array<Element>>(arr: T){

    }
}

extension Array {
    func doSomethingWithAnotherArray<T: Array<U>, U>(arr: T) where U == Element{

    }
}

所以我可以将其用作:

let x = [1, 2]
let y = [3, 4]
x.doSomethingWithAnotherArray(arr: y)
Since x and y has the same elements.

2 个答案:

答案 0 :(得分:1)

只需传递类型为Array的参数

extension Array {
    func doSomethingWithAnotherArray(arr: Array) {
        ... // do something  
    }
}

[Int].doSomethingWithAnotherArray(arr: [Int]) // works
[Int].doSomethingWithAnotherArray(arr: [String]) // doesn't work

答案 1 :(得分:1)

如果唯一的限制是参数的Element与接收者的相同:

extension Array {
    func doSomethingWithAnotherArray(arr: Array<Element>) {
        // …
    }
}

edit:如this answer所示,简单的Array就足够了,因为该函数本身不是通用的,并且在通用类型的上下文中,Array已专门用于接收器的类型。

如果您需要对Element设置其他限制,请使用extension Array where Element …