作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
谁能给我一个很好的理由来说明为什么这不起作用:
let a: [Int]? = [1]
let b: [Int]? = nil
a == b
这将是我提出的(如果不雅)解决方案。但这是微不足道的,所以我觉得我错过了一个很好的理由,为什么它没有实现。
func ==<T: Equatable>(lhs: [T]?, rhs: [T]?) -> Bool {
if let lhs = lhs, let rhs = rhs {
return lhs == rhs
}
else if let _ = lhs {
return false
}
else if let _ = rhs {
return false
}
return true
}
最佳答案
更新条件一致性已在Swift 4.1中实现。Equatable
的数组和可选值元素本身 Equatable
现在,你的代码
let a: [Int]? = [1]
let b: [Int]? = nil
a == b
在 Xcode 9.3 中按预期编译和工作。解决方法不是不再需要了。
(旧答案:)仅当底层包装类型是可等式时才可以比较可选:
public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool
现在数组可以比较如果元素类型是相等的:
/// Returns true if these arrays contain the same elements.
public func ==<Element : Equatable>(lhs: [Element], rhs: [Element]) -> Bool
但即使是可等值类型 T
, Array<T>
不符合 Equatable
协议(protocol)。
目前,这在 Swift 中是不可能的,请参见示例 Why can't I make Array conform to Equatable?进行讨论在 Apple 开发者论坛中。这种变化随着实现的 SE-0143 Conditional conformances在 Swift 4 中。
您的实现看起来是正确的,这里可能有一个不同的实现将 switch/case 与模式匹配结合使用:
func ==<T: Equatable>(lhs: [T]?, rhs: [T]?) -> Bool {
switch (lhs, rhs) {
case let (l?, r?) : // shortcut for (.Some(l), .Some(r))
return l == r
case (.None, .None):
return true
default:
return false
}
}
关于swift - 为什么没有为可选数组定义 Equatable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33244527/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!