在 Swift 3 中使用 NSNumber 和整数值

Posted

技术标签:

【中文标题】在 Swift 3 中使用 NSNumber 和整数值【英文标题】:Working with NSNumber & Integer values in Swift 3 【发布时间】:2017-01-12 06:47:35 【问题描述】:

我正在尝试将我的项目转换为 Swift 3.0,但是在使用 NSNumberIntegers 时出现两条错误消息。

无法将类型 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 属性值上,itemNSManagedObject

所以基本上我在为NSNumber 类型的属性添加数字时遇到问题。我正在使用NSNumber,因为它们是NSManagedObject 的属性。

谁能帮帮我?我有超过 80 个错误,这些错误都是上述错误之一。

谢谢

【问题讨论】:

【参考方案1】:

在 Swift 3 之前,许多类型会自动“桥接”到 必要时一些NSObject子类的实例,例如String NSString,或IntFloat,...到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 3中键入任何没有下标错误

Swift:NSNumber 不是 UIViewAnimationCurve 的子类型

Swift 无法将 NSNumber 桥接到 Float [重复]

将 ObjC NSNumber 代码迁移到 Swift 并在显示数字时遇到问题。

Swift 无法将 NSNumber 桥接到 Int