我知道这是一个简单的问题,但我在寻找解决方案时遇到了问题。
在Swift 2.2中,我收到了这个错误。
无法将'String'类型的值转换为预期的参数类型 '@noescape(AnyObject)抛出 - >布尔“
这是代码。
var tableDataSectionsDict: CHOrderedDictionary?
if !tableDataSectionsDict!.allKeys.contains("Yesterday") {
tableDataSectionsDict!.insertObject(YesterdayArray, forKey: "Yesterday", atIndex: count)
}
我在这里缺少什么?任何人都可以对它有所了解吗?
答案 0 :(得分:4)
我假设CHOrderedDictionary
是this 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中的AnyObject
。 AnyObject
不符合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 {
//...
}