在 Swift 3 中使用 NSNumber 和整数值
Working with NSNumber & Integer values in Swift 3
我正在尝试将我的项目转换为 Swift 3.0,但是在使用 NSNumber
和 Integers
时出现两条错误消息。
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'
然后我创建了一个名为 one
的 NSNumber
类型的 属性 添加到 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
子类的实例,例如 String
到
NSString
,或Int
,Float
,...到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)
我正在尝试将我的项目转换为 Swift 3.0,但是在使用 NSNumber
和 Integers
时出现两条错误消息。
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'
然后我创建了一个名为 one
的 NSNumber
类型的 属性 添加到 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
子类的实例,例如 String
到
NSString
,或Int
,Float
,...到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)