【问题标题】:Cannot convert value of type 'String' to expected argument type '(Any) throws -> Bool'无法将“String”类型的值转换为预期的参数类型“(Any) throws -> Bool”
【发布时间】:2017-10-29 21:27:45
【问题描述】:

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

}

【问题讨论】:

标签: arrays swift string closures


【解决方案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)
    }
}

【讨论】:

  • 感谢 Otavio,这肯定是我尝试过的变体之一,但你成功了!
  • 嗨 - 我以为已经修复了它,但实际上这给出了一个错误“二进制运算符 '==' 不能应用于 'Any' 和 'String' 类型的操作数”
  • @richc 已修复,它现在应该适用于您的情况,没有问题。 OOPer 的回答也不错。
【解决方案2】:

两件事:

  • array(forKey:) 的返回类型为[Any]?,其元素类型Any 几乎对所有操作都没用。当您知道实际的 Element 类型时,最好将其转换为适当的类型。

  • 方法名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)
    }
}
猜你喜欢
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多