我已经看到了这个“快速平等协议”问题的答案,该问题提到了如何==
在全局范围内声明该方法。
如果我不采用Equatable
,我仍然可以声明==
测试两种类型之间的相等性。
// extension Foo: Equatable {}
func ==(lhs: Foo, rhs: Foo) -> Bool {
return lhs.bar == rhs.bar
}
struct Foo {
let bar:Int
}
需要在全局范围内声明其实现这一事实,这使得该协议似乎是 附带的 ,也与协议 有所不同 ,即使Equatable
已被采纳。
该Equatable
协议除了仅使(我们和)编译器安全地知道我们的类型实现了协议所需方法的语法糖外,还有什么?
为什么即使对于协议,也必须全局声明操作员实现?这是否是由于调度操作员的方式不同?
从Xcode 8 beta 4发行说明中:
可以在类型或扩展名内定义运算符。例如:
struct Foo: Equatable { let value: Int static func ==(lhs: Foo, rhs: Foo) -> Bool { return lhs.value == rhs.value } }
此类运算符必须声明为
static
(或在一个类中class final
),并且必须具有与全局对应运算符相同的签名。作为此更改的一部分,还必须明确声明协议中声明的操作员要求static
:protocol Equatable { static func ==(lhs: Self, rhs: Self) -> Bool }
最近(2016-01-31至2016-02-09)在swift-evolution列表上对此进行了讨论。克里斯·拉特纳(ChrisLattner)所说的关于在结构或类范围内声明运算符的内容:
是的,这是一个普遍希望的功能(至少对于对称算子而言)。这对于在类声明中动态分配运算符也非常有用。我认为我们没有一个明确的建议来确定名称查找与此相关的工作方式。
后来(回复Haravikk):
名称查找问题是什么?您是说Foo == Foo的运算符存在于多个位置的情况吗?
是。名称查找必须具有定义明确的搜索顺序,该顺序定义阴影和无效的多个定义规则。
就我个人而言,我只是坚持我们现在拥有的东西,即,无论如何都将特定类/结构中的运算符实现视为全局定义,并且如果多次声明同一签名,则会抛出错误。
我们需要多个模块来定义一个运算符的实例,我们需要扩展中的运算符,并且需要追溯一致性才能像其他任何成员一样工作。
问题内容: 如果我制作了一个不实现Serializable的Composite-id类,例如: 发生错误,例如: hibernate实体类不必是可序列化的。那么,为什么Composite- id类必须实现Serializable?我读了这个主题,但是没有给我足够的信息。 问题答案: 会话对象需要可序列化,因此它引用的所有对象也必须可序列化。id用作索引会话中已加载对象的键。如果是Composite
问题内容: 为什么我要有一个数组并在其中放入一堆不同大小的类型… …除了和.... 文档说明: “ AnyObject可以代表任何类类型的实例” 但是,当我命令点击,或者看到这些类型的标准库定义,我看到他们都值。 这里的根本问题是什么?为什么这样设计? 问题答案: Swift中有两种类型的东西- 可以真正容纳任何东西-结构,枚举或类,以及只能容纳类。 有时似乎可以保留结构的原因是,某些特定类型会根
问题内容: 无论是Javadoc还是代码本身,Comparator接口都定义了: 但这没有编译任何概率: 但这确实是: 接口不允许用户重写方法的方法是什么? 问题答案: 首先,JavaDocs清楚地解释了您应该实现此方法: 此外,仅当指定对象也是一个比较器并且施加与该比较器相同的顺序时,此方法才能返回true。因此,意味着对于每个对象引用和。 但后来: 请注意,始终不要覆盖即可。 即使它是接口的一
根据文档,newInstance()返回一个T:https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance() 所以,如果我有一个返回T的方法,为什么我必须强制转换构造函数的返回。newInstance()到T?
C字符串或std::strings是否可以创建为,还是必须在运行时创建? 使用gcc 4.9.2,我可以做到这一点: (遗憾的是,2013年11月的客户技术预览版不允许Visual Studio支持此功能:https://stackoverflow.com/a/29255013/2642059) 但是即使使用gcc 4.9.2,我也不能这样做: 我得到的错误: 但我想进一步澄清为什么不是文字。也就