我有一个声明为var noOfPlayers: [PlayerDetail]!的变量现在让我们说我在var playerReadyStatus: Bool = true内部声明为PlayerDetail的属性。现在,对于noOfPlayers中的每个元素,我想更改PlayerDetail的此属性。我正在使用 map 来实现这一点

 func resetPlayerStatus(){
        noOfPlayers = noOfPlayers.map{ $0.playerReadyStatus = false; return $0}
    }

过去在Xcode 9中可以正常工作,但是当我更新到Xcode 10时说Value of type '[PlayerDetail]' has no member 'playerReadyStatus'Xcode 10中的 map 功能是否发生了变化?使用map的新方法应该是什么?

最佳答案

为什么会发生此错误

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

由于noOfPlayers的类型是[PlayerDetail]?,因此您的代码正在使用Optional map(_:) 。它检查该值是否为nil,并在未包装的值(非零)上应用转换。这意味着,如果noOfPlayers不为nil,则将未包装的[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
    }
}

10-08 15:42