プロジェクトをSwift 3.0に変換しようとしていますが、NSNumber
とIntegers
を操作するときに2つのエラーメッセージが表示されます。
NSint型にint型を割り当てることができません
for
//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
というプロパティを作成しますが、次のエラーが発生します。
二項演算子 '+ ='は2つのNSNumberオペランドに適用できません
&&私が得る2番目のエラーは
'+'候補は、期待されるコンテキスト結果タイプNSNumberを生成しません
let num: Int = 210
let num2: Int = item.points.intValue
item.points = num + num2
ここでは、ポイントプロパティ値に210を追加しようとしていますが、item
はNSManagedObject
です。
したがって、基本的に、NSNumber
型のプロパティに数値を追加することに頭を悩ませています。 NSNumber
のプロパティであるため、NSManagedObject
を使用しています。
誰でも私を助けることができますか?上記のエラーのいずれか1つである80を超えるエラーがあります。
ありがとう
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
ではなく整数型になり、変換せずに取得および設定できます。
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
}
または元のコードのままにして、割り当てを変更するだけで機能します:
var currentIndex = 0
for item in self.selectedFolder.arrayOfTasks {
item.index = NSNumber(integer: currentIndex)
currentIndex += 1
}
Swift 2でコードが正常に機能するため、これは次の更新で変更される可能性のある動作であると予想されます。
Swift 4.2
item.index = Int(truncating: currentIndex)