Swift array.map 将 NSNumber 转换为 UInt

标签 swift swift2

let myArray = Array(arrayLiteral: userIDs)
let newArray = myArray.map{$0 as! UInt}

下面的错误是什么意思?

Cast from 'Set?' to unrelated type 'UInt' always fails

我想将从 NSSet 创建的数组转换为使用 UInt 而不是数字的数组。

最佳答案

如果userIDsSet<NSNumber>然后做 Array(arrayLiteral: userIDs)不会根据集合内容创建数组,它会创建一个包含集合本身的数组。

删除 arrayLiteral初始化:

let num1 = NSNumber(integer: 33)
let num2 = NSNumber(integer: 42)
let num3 = NSNumber(integer: 33)
let nums = [num1, num2, num3] // [33, 42, 33]
let userIDs = Set(nums) // {33, 42}
let myArray = Array(userIDs) // [33, 42]

然后你可以映射到任何你想要的:

let newArray = myArray.map{ UInt($0) } 

发表评论后更新

如果你有 Foundation 的 NSSet 而不是 Swift 的 Set,你可以这样做:

let userIDs = NSSet(array: nums)
let myArray = userIDs.map { $0 as! NSNumber }
let newArray = myArray.map { UInt($0) }

我们必须将 NSSet 的内容向下转换为 NSNumber,因为 NSSet 不保留元素的类型。

关于Swift array.map 将 NSNumber 转换为 UInt,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36838874/

相关文章:

ios - Swift - 如果语句不能正常工作

ios - 如何检测 Swift 2 中的所有触摸

ios - Swift +隐藏或删除 UIView

ios - FacebookSDK(4.1.x) 自定义登录 UI 按钮 - Swift(1.2)

swift - 'if (let keychain = KeychainService.loadToken())' 给我一个预期的声明错误

ios - 将自定义对象保存到 NSUserDefaults - 无法设置编码器和解码器方法

swift - startAccelerometerUpdatesToQueue 表达式类型在没有更多上下文的情况下不明确

ios - NSDate格式扩展中的EXC_BAD_ACCESS

error-handling - 调用可能引发错误消息Swift 2

swift2 - 'init'是该类型的成员;使用'type(of: …)'初始化一个新对象