在 Swift 3 中使用 NSNumber 和整数值
Posted
技术标签:
【中文标题】在 Swift 3 中使用 NSNumber 和整数值【英文标题】:Working with NSNumber & Integer values in Swift 3 【发布时间】:2017-01-12 06:47:35 【问题描述】:我正在尝试将我的项目转换为 Swift 3.0,但是在使用 NSNumber
和 Integers
时出现两条错误消息。
无法将类型 int 分配给类型 NSNumber
为
//item is a NSManaged object with a property called index of type NSNumber
var currentIndex = 0
for item in self.selectedObject.arrayOfItems
item.index = currentIndex
currentIndex += 1
即使我将currentIndex
更改为NSNumber
类型,我也会收到错误
二元运算符“+=”不能应用于类型“NSNumber”和“Int”
然后我创建了一个名为one
类型为NSNumber
的属性以添加到currentIndex
,但随后出现以下错误;
二元运算符 '+=' 不能应用于两个 NSNumber 操作数
&& 我得到的第二个错误是
没有“+”候选产生预期的上下文结果类型 NSNumber
let num: Int = 210
let num2: Int = item.points.intValue
item.points = num + num2
这里我只是想将 210 添加到 points 属性值上,item
是 NSManagedObject
。
所以基本上我在为NSNumber
类型的属性添加数字时遇到问题。我正在使用NSNumber
,因为它们是NSManagedObject
的属性。
谁能帮帮我?我有超过 80 个错误,这些错误都是上述错误之一。
谢谢
【问题讨论】:
【参考方案1】:在 Swift 3 之前,许多类型会自动“桥接”到
必要时一些NSObject
子类的实例,例如String
NSString
,或Int
,Float
,...到NSNumber
。
从 Swift 3 开始,您必须明确地进行转换:
var currentIndex = 0
for item in self.selectedFolder.arrayOfTasks
item.index = currentIndex as NSNumber // <--
currentIndex += 1
或者,在创建NSManagedObject
子类时使用选项“使用原始数据类型的标量属性”,
那么属性有一些整数类型而不是NSNumber
,
这样您就可以在不转换的情况下获取和设置它。
【讨论】:
你可以在这里找到完整的解释:SE-0072【参考方案2】:在 Swift 4 中(在 Swift 3 中可能相同)NSNumber(integer: Int)
被替换为 NSNumber(value: )
其中value
几乎可以是任何类型的数字:
public init(value: Int8)
public init(value: UInt8)
public init(value: Int16)
public init(value: UInt16)
public init(value: Int32)
public init(value: UInt32)
public init(value: Int64)
public init(value: UInt64)
public init(value: Float)
public init(value: Double)
public init(value: Bool)
@available(ios 2.0, *)
public init(value: Int)
@available(iOS 2.0, *)
public init(value: UInt)
【讨论】:
【参考方案3】:Swift 4:
var currentIndex:Int = 0
for item in self.selectedFolder.arrayOfTasks
item.index = NSNumber(value: currentIndex) // <--
currentIndex += 1
【讨论】:
【参考方案4】:您应该保留原始代码,只需更改分配,使其正常工作:
var currentIndex = 0
for item in self.selectedFolder.arrayOfTasks
item.index = NSNumber(integer: currentIndex)
currentIndex += 1
由于您的代码在 Swift 2 中运行良好,我预计这种行为可能会在下一次更新中改变。
【讨论】:
【参考方案5】:斯威夫特 4.2
item.index = Int(truncating: currentIndex)
【讨论】:
以上是关于在 Swift 3 中使用 NSNumber 和整数值的主要内容,如果未能解决你的问题,请参考以下文章
使用 Swift,从 plist 加载数据时,如何区分布尔值和整数值?
Swift:NSNumber 不是 UIViewAnimationCurve 的子类型
Swift 无法将 NSNumber 桥接到 Float [重复]