我有一个声明为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
}
}