无法将类型 'Option' 的值转换为预期的参数类型“@noescape (Option) throws -> Bool”
Cannot convert value of type 'Option' to expected argument type '@noescape (Option) throws -> Bool'
我有一个叫 Option
的 class。这是一个 Realm 对象,所以它是 Realm 自己的基础 class Object
.
的子class
在视图控制器中,我有一个数组 属性,其中包含一堆 Option
个对象。
private var options = [Option]()
在视图控制器下的一个方法中,我需要检查某个 Option
对象是否包含在上述选项数组中。
以前(Swift1.2),我有这样的检查逻辑。
func itemSelected(selection: Object) {
let option = selection as! Option
if !contains(options, option) {
// act accordingly
}
}
现在我正在将项目转换为 Swift 2(我也将 Realm 的版本更新为 Swift 2 版本)。我将代码更新为这个。
func itemSelected(selection: Object) {
let option = selection as! Option
if !options.contains(option) {
// act accordingly
}
}
但是现在我遇到了以下编译错误!
无法将类型 'Option' 的值转换为预期的参数类型 '@noescape (Option) throws -> Bool'
我不明白为什么。有什么想法吗?
这是因为 contains
函数现在需要一个闭包,而不是所有非等式类型的元素。您需要做的就是将其更改为以下内容
if !(options.contains{[=10=]==option}) {
// act accordingly
}
它所做的是将一个闭包传递给函数,returns 仅当该闭包满足其任何元素时才为真。 [=12=]
代表 contains
函数正在测试的数组中的当前元素,如果该元素等于您要查找的元素,则 returns 为真。
虽然第一个答案表明出现此问题是因为 contains
方法需要对 Equatable
类型进行操作,但这是正确的,但这只是故事的一半。领域 Object
class 继承 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。
我有一个叫 Option
的 class。这是一个 Realm 对象,所以它是 Realm 自己的基础 class Object
.
在视图控制器中,我有一个数组 属性,其中包含一堆 Option
个对象。
private var options = [Option]()
在视图控制器下的一个方法中,我需要检查某个 Option
对象是否包含在上述选项数组中。
以前(Swift1.2),我有这样的检查逻辑。
func itemSelected(selection: Object) {
let option = selection as! Option
if !contains(options, option) {
// act accordingly
}
}
现在我正在将项目转换为 Swift 2(我也将 Realm 的版本更新为 Swift 2 版本)。我将代码更新为这个。
func itemSelected(selection: Object) {
let option = selection as! Option
if !options.contains(option) {
// act accordingly
}
}
但是现在我遇到了以下编译错误!
无法将类型 'Option' 的值转换为预期的参数类型 '@noescape (Option) throws -> Bool'
我不明白为什么。有什么想法吗?
这是因为 contains
函数现在需要一个闭包,而不是所有非等式类型的元素。您需要做的就是将其更改为以下内容
if !(options.contains{[=10=]==option}) {
// act accordingly
}
它所做的是将一个闭包传递给函数,returns 仅当该闭包满足其任何元素时才为真。 [=12=]
代表 contains
函数正在测试的数组中的当前元素,如果该元素等于您要查找的元素,则 returns 为真。
虽然第一个答案表明出现此问题是因为 contains
方法需要对 Equatable
类型进行操作,但这是正确的,但这只是故事的一半。领域 Object
class 继承 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。