首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速的,等价的程序缺陷?

快速的,等价的程序缺陷?
EN

Stack Overflow用户
提问于 2014-08-09 14:11:14
回答 2查看 1.9K关注 0票数 3

我正在Swift中构建一个非常简单的结构,其中包含一个可选值数组。这个结构必须符合平等的协议。这是代码:

代码语言:javascript
复制
struct MyTable: Equatable {
    var values: [Int?] = Array(count: 64, repeatedValue: nil)
}

func == (lhs: MyTable, rhs: MyTable) -> Bool {
    return lhs.values == rhs.values
}

很简单。我没有看到错误,但是编译器给出了错误:"'Int?‘不能转换为'MyTable'“。我在做什么蠢事吗?或者这是编译器的错误?谢谢!

(使用Xcode6-Beta5)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-09 21:07:05

它不能工作的原因是没有为具有可选元素的数组定义==运算符,只为非可选元素定义:

代码语言:javascript
复制
/// Returns true if these arrays contain the same elements.
func ==<T : Equatable>(lhs: [T], rhs: [T]) -> Bool

你可以提供你自己的:

代码语言:javascript
复制
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
}
票数 7
EN

Stack Overflow用户

发布于 2016-01-28 07:13:28

另一个有用的选项是使用在elementsEqual:isEquivalent:上可用的SequenceType方法。这可以让您避免实现Equatable,但最好是很少使用,因为它更冗长。

用法:

代码语言:javascript
复制
let a: [Int?] = []
let b: [Int?] = []

if a.elementsEqual(b, isEquivalent: { $0 == $1 }) {
    print("foo") // Works
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25219416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档