Swift,Equatable 协议错误?
Posted
技术标签:
【中文标题】Swift,Equatable 协议错误?【英文标题】:Swift, Equatable protocol bug? 【发布时间】:2014-08-09 14:11:14 【问题描述】:我正在 Swift 中构建一个非常简单的结构,其中包含一组可选值。该结构必须符合 Equatable 协议。这是代码:
struct MyTable: Equatable
var values: [Int?] = Array(count: 64, repeatedValue: nil)
func == (lhs: MyTable, rhs: MyTable) -> Bool
return lhs.values == rhs.values
很简单。我没有看到任何错误,但编译器给出了错误:“'[Int?]' is not convertible to 'MyTable'”。我在做傻事吗?或者这是编译器的错误?谢谢!
(使用 Xcode6-Beta5)
【问题讨论】:
如果'values'数组被声明为[Int] instad of [Int?],一切正常。为什么不使用 [Int?]? 【参考方案1】:它不起作用的原因是没有为具有可选元素的数组定义==
运算符,仅针对非可选元素:
/// Returns true if these arrays contain the same elements.
func ==<T : Equatable>(lhs: [T], rhs: [T]) -> Bool
您可以提供自己的:
func ==<T : Equatable>(lhs: [T?], rhs: [T?]) -> Bool
if lhs.count != rhs.count
return false
for index in 0..<lhs.count
if lhs[index] != rhs[index]
return false
return true
【讨论】:
哦!我忽略了这一点。奇怪的是它没有定义...谢谢! 太棒了。谢谢老哥!【参考方案2】:另一个有用的选项是使用SequenceType
上可用的elementsEqual:isEquivalent:
方法。这可以让您避免实现Equatable
,但最好很少使用,因为它更冗长。
用法:
let a: [Int?] = []
let b: [Int?] = []
if a.elementsEqual(b, isEquivalent: $0 == $1 )
print("foo") // Works
【讨论】:
以上是关于Swift,Equatable 协议错误?的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 具有实现通用协议的值的 Typealias 字典
来自 equatable 协议的 func == 不适用于自定义对象,swift
Swift 5:在使用协议实现 Equatable 的结构上实现通用数组操作