代码之家  ›  专栏  ›  技术社区  ›  Michel

Swift 4.2怪异-地图-行为

  •  4
  • Michel  · 技术社区  · 7 年前

    在Swift 4.2中使用集合中的.map时遇到问题。 以下是正在发生的事情:

    我有一个财产声明如下:

    var cbPerifList:[CBPeripheral]!
    

    在代码的后面,当我编写:

    _ = cbPerifList.map { (perif) -> Void in
        print(perif.identifier)
    }
    

    但当我写作时:

    _ = cbPerifList.map { (perif) -> Void in
        print(perif.identifier)
        print("HELLO")
    }
    

    Value of type '[CBPeripheral]' has no member 'identifier'
    

    在代码行: 打印(周期标识符)

    1. 打印(“你好”)

    2 回复  |  直到 7 年前
        1
  •  4
  •   Martin R    7 年前

    如其他答案和评论中所述,使用 forEach for ... in

    在单语句闭包中

    _ = cbPerifList.map { (perif) -> Void in
        print(perif.identifier)
    }
    

    编译器尝试从 print perif.identifier ,IUO cbPerifList 必须展开为数组。

    _ = cbPerifList.map { (perif) -> Void in
        print(perif.identifier)
        print("HELLO")
    }
    

    地图() 这是上面提到的吗 Optional.map perif [CBPeripheral] . 这就是为什么 周期标识符 不使用错误消息编译

    “[CBPeripheral]”类型的值没有成员“标识符”

    您可以使用显式类型注释来帮助编译器

    _ = cbPerifList.map { (perif: CBPeripheral) -> Void in
        print(perif.identifier)
        print("HELLO")
    }
    

        2
  •  2
  •   pbodsk    7 年前

    路途 map 在你的 [CBPeripheral] 对于每个元素 地图 identifier 是一个 String ,将以字符串数组结束。

    但是:)

    在您的例子中,您已经像这样定义了映射函数

    (perif) -> Void
    

    这意味着您将使用一个不返回任何内容的函数运行数组和调用映射。这意味着结果将是一个填充了空值的数组。

    因此,正如其他人在评论中所建议的,如果您只想检查 cbPerifList ,你最好使用 for in

    for cbPerif in cbPerifList {
        print(cbPerif.identifier)
    }
    

    然而,若您对获取您的用户的名称数组感兴趣 CBPeripherals

    let names = cbPerifList.map { $0.identifier }
    

    对上面的评论:阅读更多关于我们如何结束写作的文章 { $0.name } 请看一下关于 Closures this answer