Swift:无法将'String'类型的值转换为预期的参数类型'@noescape(AnyObject)throws - >布尔”

时间:2016-04-25 17:45:16

标签: ios arrays swift swift2 ios9

我知道这是一个简单的问题,但我在寻找解决方案时遇到了问题。

在Swift 2.2中,我收到了这个错误。

  

无法将'String'类型的值转换为预期的参数类型   '@noescape(AnyObject)抛出 - >布尔“

这是代码。

var tableDataSectionsDict: CHOrderedDictionary?
if !tableDataSectionsDict!.allKeys.contains("Yesterday") {
   tableDataSectionsDict!.insertObject(YesterdayArray, forKey: "Yesterday", atIndex: count)
}

enter image description here

我在这里缺少什么?任何人都可以对它有所了解吗?

1 个答案:

答案 0 :(得分:4)

我假设CHOrderedDictionarythis CHOrderedDictionary。如果是这种情况,那么你已经与Swift联系了一个Objective-C类型(如果我错了,请纠正我)。

有两种contains功能:

extension SequenceType where Generator.Element : Equatable {
    /// Returns `true` iff `element` is in `self`.
    @warn_unused_result
    public func contains(element: Self.Generator.Element) -> Bool
}

extension SequenceType {
    /// Returns `true` iff an element in `self` satisfies `predicate`.
    @warn_unused_result
    public func contains(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool
}

CHOrderedDictionary的键和值从Objective-C中的id转换为Swift中的AnyObjectAnyObject不符合Equatable,因此您无法使用第一个contains函数。您可以在CHOrderedDictionary周围编写一个包装器,以便在您真正想要时允许一些Equatable元素类型。

此处最快的解决方案是使用更通用的contains版本(第二个contains)。在代码中,它看起来像这样:

// contains will iterate over the entire allKeys array. $0 is the key at each iteration.
let containsKey = tableDataSectionsDict!.allKeys.contains { return $0 as? String == "Yesterday" }
if !containsKey {
    //...
}