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

时间:2017-10-29 21:27:45

标签: arrays swift string closures

我正在努力检查数组的语法以查看它是否包含字符串。我正在使用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)
    }

}

2 个答案:

答案 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)
    }
}