Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 协议扩展和直接调用的区别_Swift_Protocols - Fatal编程技术网

Swift 协议扩展和直接调用的区别

Swift 协议扩展和直接调用的区别,swift,protocols,Swift,Protocols,我得到了这个密码: protocol Protocol { var id: Int { get } } extension Array where Element: Protocol { func contains(_protocol: Protocol) -> Bool { return contains(where: { $0.id == _protocol.id }) } } class Class { func method<

我得到了这个密码:

protocol Protocol {
    var id: Int { get }
}

extension Array where Element: Protocol {
    func contains(_protocol: Protocol) -> Bool {
        return contains(where: { $0.id == _protocol.id })
    }
}

class Class {
    func method<T: Protocol>(_protocol: T) {
        var arr = [Protocol]()

        // Does compile
        let contains = arr.contains(where: { $0.id == _protocol.id })

        // Doens't compile
        arr.contains(_protocol: _protocol)
    }
}
当我将扩展名中的方法名称更改为其他名称时,例如containz,当然也更改了将其调用到containz的方法的名称,当我尝试调用它时,会出现以下错误:

Using 'Protocol' as a concrete type conforming to protocol 'Protocol' is not supported

但是为什么当我试图通过扩展调用它时它不起作用,但是当我直接在扩展中创建函数时它起作用呢?我看不出有什么区别。

我同意马特的观点,基本答案是,但无论如何,这可能值得回答,因为在这种情况下,答案非常简单。首先,阅读相关问题,关于[协议]为什么不能按你认为的方式工作,特别是哈米什的答案,这比我写的公认答案要广泛得多。[Protocol]与where元素:Protocol子句不匹配,因为Protocol不是符合Protocol的具体类型,因为它不是具体类型

但这里不需要[协议]。您有T:Protocol,所以您可以也应该使用它:

var arr = [T]()

有了这个变化,其余的应该像您期望的那样工作,因为T是一个符合协议的具体类型。

最终可能是
var arr = [T]()