与NSNumber& Swift 3中的整数值

时间:2016-09-04 20:55:03

标签: ios swift int swift3 nsnumber

我正在尝试将我的项目转换为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的{​​{1}}类型的属性,以添加到NSNumber,但随后出现以下错误;

  

二元运算符'+ ='不能应用于两个NSNumber操作数

&安培;&安培;我得到的第二个错误是

  

没有'+'候选人产生预期的上下文结果类型NSNumber

currentIndex

此处我只是尝试将210添加到点属性值, let num: Int = 210 let num2: Int = item.points.intValue item.points = num + num2 item

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

任何人都可以帮助我吗?我有80多个错误,这些错误都是上面提到的错误之一。

谢谢

5 个答案:

答案 0 :(得分:55)

在Swift 3之前,许多类型都是自动“桥接”#34;到了 必要时某些NSObject子类的实例,例如String NSString,或IntFloat,...到NSNumber

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

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

或者,使用选项&#34;对原始数据类型使用标量属性&#34;在创建NSManagedObject子类时, 那么该属性有一些整数类型而不是NSNumber, 这样你就可以在没有转换的情况下进行设置。

答案 1 :(得分:5)

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

答案 2 :(得分:3)

Swift 4

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

答案 3 :(得分:2)

您应该使用原始代码,只需更改分配,以便它可以正常运行:

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

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

答案 4 :(得分:0)

Swift 4.2

item.index = Int(truncating: currentIndex)