是否可以将变量或常量的类型设置为Swift中的协议等式

是否可以将变量或常量的类型设置为Swift中的协议等式,swift,generics,protocols,Swift,Generics,Protocols,我不熟悉斯威夫特。我正在尝试做类似的事情: let e:Equatable? where Equatable.Item == Int = nil 这可能吗 问候, shodz简单的回答是,您不能基于协议创建变量 正如官方文件所述: 协议定义了方法、属性和其他属性的蓝图 适合特定任务或功能的需求。 然后,类、结构或枚举可以采用该协议 提供这些要求的实际实施。任何类型 满足协议要求的称为符合 该议定书 因此,开发人员所需的最小工作量是创建符合特定协议的结构或类,比如说equalable 让我们再举

我不熟悉斯威夫特。我正在尝试做类似的事情:

let e:Equatable? where Equatable.Item == Int = nil
这可能吗

问候,


shodz

简单的回答是,您不能基于协议创建变量

正如官方文件所述:

协议定义了方法、属性和其他属性的蓝图 适合特定任务或功能的需求。 然后,类、结构或枚举可以采用该协议 提供这些要求的实际实施。任何类型 满足协议要求的称为符合 该议定书

因此,开发人员所需的最小工作量是创建符合特定协议的结构或类,比如说
equalable

让我们再举一个官方文档中的例子。
equalable
协议允许比较同一类型的两个元素,因此需要实现
==(lhs:type,rhs:type,)
方法

class StreetAddress {
    let number: String
    let street: String
    let unit: String?

    init(_ number: String, _ street: String, unit: String? = nil) {
        self.number = number
        self.street = street
        self.unit = unit
    }
}

extension StreetAddress: Equatable {
    static func == (lhs: StreetAddress, rhs: StreetAddress) -> Bool {
        return
            lhs.number == rhs.number &&
            lhs.street == rhs.street &&
            lhs.unit == rhs.unit
    }
}

只有现在,才能根据谓词创建和比较
StreetAddress
的两个实例。

简单的回答是,不能基于协议创建变量

正如官方文件所述:

协议定义了方法、属性和其他属性的蓝图 适合特定任务或功能的需求。 然后,类、结构或枚举可以采用该协议 提供这些要求的实际实施。任何类型 满足协议要求的称为符合 该议定书

因此,开发人员所需的最小工作量是创建符合特定协议的结构或类,比如说
equalable

让我们再举一个官方文档中的例子。
equalable
协议允许比较同一类型的两个元素,因此需要实现
==(lhs:type,rhs:type,)
方法

class StreetAddress {
    let number: String
    let street: String
    let unit: String?

    init(_ number: String, _ street: String, unit: String? = nil) {
        self.number = number
        self.street = street
        self.unit = unit
    }
}

extension StreetAddress: Equatable {
    static func == (lhs: StreetAddress, rhs: StreetAddress) -> Bool {
        return
            lhs.number == rhs.number &&
            lhs.street == rhs.street &&
            lhs.unit == rhs.unit
    }
}

只有现在才能根据谓词创建和比较两个
StreetAddress实例。

只要所讨论的协议要求使用
关联类型
或使用
Self
,您就不能这样做。简言之,它给编译器造成了太多的歧义。Equalable具有使用
Self
的需求。在不了解您的用例的情况下,很难提出建议,但在许多情况下,您会想到这一点,答案是将泛型冒泡到一个级别(例如,如果这一行代码位于函数内部,则将函数泛型化到可等式值之上,并使用泛型类型):

func doSomething(带值:T?{…}

或者,另一种选择是调查。但是,如果我们对您的用例了解得更多一些,那么提供建议可能会更容易。

只要所讨论的协议有使用
关联类型
或使用
自我
的要求,您就不能这样做。简言之,它给编译器造成了太多的歧义。Equalable具有使用
Self
的需求。在不了解您的用例的情况下,很难提出建议,但在许多情况下,您会想到这一点,答案是将泛型冒泡到一个级别(例如,如果这一行代码位于函数内部,则将函数泛型化到可等式值之上,并使用泛型类型):

func doSomething(带值:T?{…}

或者,另一种选择是调查。但是,如果我们对您的用例了解得更多一些,提供建议可能会更容易。

请您解释一下您想要实现什么?这个表达式的目标是什么?基本上,将常量声明为协议类型是毫无意义的。在Java中,我们通常可以基于接口创建变量类型,并分配泛型参数类型。我想知道是否有可能在Swift中实现同样的功能。PAT(具有关联类型的协议)与接口不同。在Swift中,对Java中问题的许多思考方式是不同的。如果您展示了您实际想要做的事情,我们可能会有所帮助,因为上面的示例在Java中是无用的,因此缺少Swift等价物是没有意义的。它字面上说
e
的类型是
Int?
,这是最难的。请您解释一下您想要实现什么?这个表达式的目的是什么?基本上,将常量声明为协议类型是毫无意义的。在Java中,我们通常可以基于接口创建变量类型,并分配泛型参数类型。我想知道是否有可能在Swift中实现同样的功能。PAT(具有关联类型的协议)与接口不同。在Swift中,对Java中问题的许多思考方式是不同的。如果您展示了您实际想要做的事情,我们可能会有所帮助,因为上面的示例在Java中是无用的,因此缺少Swift等价物是没有意义的。它直截了当地说“e
的类型是
Int?
,这是最困难的方式。“简短回答”并不是真正正确的。你完全可以根据协议定义变量,只要它没有关联类型或自我要求。“简短回答”是“这不是真的正确。您完全可以基于协议定义变量,只要它没有关联类型或自身需求。