地图功能变化 Xcode 10

Map function changes in Xcode 10

我有一个声明为 var noOfPlayers: [PlayerDetail]! 的变量 现在假设我在 PlayerDetail 中有一个声明为 var playerReadyStatus: Bool = true 的 属性。现在对于 noOfPlayers 中的每个元素,我想更改 PlayerDetail 的 属性。我正在使用地图来实现这一目标

 func resetPlayerStatus(){
        noOfPlayers = noOfPlayers.map{ [=11=].playerReadyStatus = false; return [=11=]} 
    }

这曾经在 Xcode 9 中运行良好,但当我更新到 Xcode 10 时,它显示 Value of type '[PlayerDetail]' has no member 'playerReadyStatus' Xcode 10 中的地图功能是否发生了变化?使用地图的新方法应该是什么?

为什么会出现这个错误

从 Swift 4.2 开始,ImplicitlyUnwrappedOptional is removed from the type system 并被替换为一个属性。这意味着 [PlayerDetail]! 的类型变为 [PlayerDetail]?(一个可选的 PlayerDetail 元素数组),并带有一个属性,说明它在使用时可以隐式解包。

由于 noOfPlayers 的类型是 [PlayerDetail]?,您的代码使用的是 Optional map(_:)。它检查该值是否为 nil,如果它不是零,则将转换应用于展开的值。这意味着如果 noOfPlayers 不为零,则展开的 [PlayerDetail] 值将传递到闭包中。玩家详细信息数组没有 playerReadyStatus 属性,这就是为什么您会看到 Value of type '[PlayerDetail]' has no member 'playerReadyStatus' 错误。

如何解决。

您可能不需要一组可选的播放器。您可以将类型更改为 [PlayerDetail],但您可能需要根据其初始化方式为其提供初始值(例如空数组)。

如果您需要区分无数组和空数组,那么在使用 noPlayers 时应将其视为可选(并且可能将 ! 更改为 ?在声明中),例如:

noOfPlayers = noOfPlayers.map { unwrappedNoOfPlayers in
    unwrappedNoOfPlayers.map { playerElement in 
        playerElement.playerReadyStatus = false; return playerElement 
    } 
}