ios - Xcode 10 中 map 功能的变化

标签 ios filter higher-order-functions xcode10 swift4.1

我有一个变量声明为 var noOfPlayers: [PlayerDetail]! 现在假设我有一个属性声明为 var playerReadyStatus: Bool = true inside 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 并在非 nil 的情况下对展开的值应用转换。这意味着如果 noOfPlayers 不为零,则展开的 [PlayerDetail] 值将传递到闭包中。播放器详细信息数组没有 playerReadyStatus 属性,这就是为什么您会看到 类型“[PlayerDetail]”的值没有成员“playerReadyStatus”错误。

如何解决。

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

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

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

关于ios - Xcode 10 中 map 功能的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52589961/

相关文章:

ios - 错误 ITMS-90096 : "Your binary is not optimized for iPhone 5"

css - 如何修复此 CSS 验证错误..?

haskell - 高阶函数内的多态性?

ios - Swift 3.0 map 返回到以前的 MapView

ios - 如何在 swift5 和 Alamofire 5 beta 版本中获取和保存响应?

django - 向 Objects.filter 添加额外参数(通过 Dict)?

java - JPA creteria 查询中的 NullPointerException(在 where 子句上带有过滤条件)

ios - 如何快速计算 UInt16 值数组的总和?

perl - Perl 中的 HashMap

ios - 圆圈内数字的 CSS,iOS 的位置已关闭