我有一个名为Option
的班级。这是一个Realm对象,因此它是Realm自己的基类Object
的子类。
在视图控制器中,我有一个数组属性,它包含一堆Option
个对象。
private var options = [Option]()
在视图控制器中的方法中,我需要检查上述选项数组中是否包含某个Option
对象。
以前(Swift 1.2),我有这样的检查逻辑。
func itemSelected(selection: Object) {
let option = selection as! Option
if !contains(options, option) {
// act accordingly
}
}
现在我将项目转换为Swift 2(我已经将Realm&s版本更新为Swift 2版本)。我将代码更新为此。
func itemSelected(selection: Object) {
let option = selection as! Option
if !options.contains(option) {
// act accordingly
}
}
但是现在我收到了以下编译错误!
无法转换类型'选项'的值期望参数类型' @noescape(期权)抛出 - >布尔'
我无法弄清楚原因。有什么想法吗?
答案 0 :(得分:9)
这是因为['mark', 'bill', '#special#', #special method#, 'johni']
函数现在需要闭包而不是所有非等同类型的元素。您需要做的就是将其更改为以下
contains
它的作用是将闭包传递给函数,只有当闭包满足其任何元素时才返回true。 if !(options.contains{$0==option}) {
// act accordingly
}
代表$0
函数正在测试的数组中的当前元素,如果该元素等于您要查找的元素,则返回true。
答案 1 :(得分:1)
虽然第一个答案,表明出现此问题是因为contains
方法需要在Equatable
类型上运行,这是真的,这只是故事的一半。领域Object
类继承NSObject
,它符合Equatable
(因此这应该在没有闭包的情况下工作)。有关此问题的更多讨论,您可以在Realm GitHub页面上引用此问题:https://github.com/realm/realm-cocoa/issues/2519。 Realm开发人员表示他们认为这是Swift中的一个错误。
最终,建议的解决方法是重新声明与Equatable
和Hashable
的一致性,就像这样(这是从GitHub用户bdash对之前发布的问题的评论中逐字复制的):
public class A: Object, Equatable, Hashable {
}
public func ==(lhs: A, rhs: A) -> Bool {
return lhs.isEqual(rhs)
}
您将该样本中的A
类型的所有实例替换为Option
。
我已经测试了这个解决方案,它在XCode 7.2.1中适用于我,使用Swift版本2.1.1。