在 Swift 3 中使用 NSNumber 和整数值

Working with NSNumber & Integer values in Swift 3

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

Cannot assign type int to type 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 时,我也会收到错误

Binary operator '+=' cannot be applied to type 'NSNumber' and 'Int'

然后我创建了一个名为 oneNSNumber 类型的 属性 添加到 currentIndex 但随后出现以下错误;

Binary operator '+=' cannot be applied to two NSNumber operands

&& 我得到的第二个错误是

No '+' candidates produce the expected contextual result type NSNumber

 let num: Int = 210
 let num2: Int = item.points.intValue
 item.points = num + num2

这里我只是想给点属性值加上210,item是一个NSManagedObject

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

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

谢谢

您应该保留原始代码并更改分配,这样它就可以工作:

var currentIndex = 0
for item in self.selectedFolder.arrayOfTasks {
    item.index = NSNumber(integer: currentIndex)
    currentIndex += 1
}

由于您的代码在 Swift 2 中运行良好,我希望这种行为可能会在下一次更新中发生变化。

在 Swift3 之前,许多类型会自动 "bridged" 必要时一些 NSObject 子类的实例,例如 StringNSString,或IntFloat,...到NSNumber

从 Swift 3 开始,您必须明确转换:

var currentIndex = 0
for item in self.selectedFolder.arrayOfTasks {
   item.index = currentIndex as NSNumber // <--
   currentIndex += 1
}

或者,在创建 NSManagedObject 子类时使用选项 "Use scalar properties for primitive data types", 然后 属性 有一些整数类型而不是 NSNumber, 以便您无需转换即可获取和设置它。

在 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)

Swift 4:

var currentIndex:Int = 0
for item in self.selectedFolder.arrayOfTasks {
   item.index = NSNumber(value: currentIndex) // <--
   currentIndex += 1
}

Swift 4.2

item.index = Int(truncating: currentIndex)