作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人能给我一个为什么这不起作用的充分理由吗:
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?进行讨论在苹果开发者论坛中。这一变化随着实现的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/35055866/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!