我正在努力检查数组的语法以查看它是否包含字符串。我正在使用contains函数检查字符串数组。但是注意到错误,我无法弄清楚闭包的语法。有人可以帮忙吗?
var connectedPeripherals = [String]()
if let connectedPeripherals = UserDefaults.standard.array(forKey: "ConnectedPeripherals") {
if connectedPeripherals.contains(where: (peripheral.identifier.uuidString)) {
// Gives error: "Cannot convert value of type 'String' to expected argument type '(Any) throws -> Bool'"
manager.connect(peripheral, options: nil)
}
}
答案 0 :(得分:2)
两件事:
array(forKey:)
的返回类型为[Any]?
,其元素类型Any
对几乎所有操作都无用。当您知道实际的元素类型时,最好将其强制转换为适当的类型。
方法名称contains
有很多重载,您可能需要拨打contains(_:)
,而不是contains(where:)
。
试试这个:
if let connectedPeripherals = UserDefaults.standard.array(forKey: "ConnectedPeripherals") as? [String] {
if connectedPeripherals.contains(peripheral.identifier.uuidString) {
manager.connect(peripheral, options: nil)
}
}
或者,正如Leo Dabus所建议的那样,这可能会更好:
if let connectedPeripherals = UserDefaults.standard.stringArray(forKey: "ConnectedPeripherals") {
if connectedPeripherals.contains(peripheral.identifier.uuidString) {
manager.connect(peripheral, options: nil)
}
}
答案 1 :(得分:1)
函数contains(where:)
需要closure
作为参数,您传递的是String
。
所以要修复你的代码应该是:
var connectedPeripherals = [String]()
if let connectedPeripherals = UserDefaults.standard.array(forKey: "ConnectedPeripherals") as? String {
if connectedPeripherals.contains(where: { $0 == peripheral.identifier.uuidString }) {
manager.connect(peripheral, options: nil)
}
}