web-dev-qa-db-ja.com

Swift 3のNSNumberおよび整数値の操作

プロジェクトをSwift 3.0に変換しようとしていますが、NSNumberIntegersを操作するときに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を追加しようとしていますが、itemNSManagedObjectです。

したがって、基本的に、NSNumber型のプロパティに数値を追加することに頭を悩ませています。 NSNumberのプロパティであるため、NSManagedObjectを使用しています。

誰でも私を助けることができますか?上記のエラーのいずれか1つである80を超えるエラーがあります。

ありがとう

33
A.Roe

Swift 3より前は、必要に応じて、NSObjectからString、またはNSStringInt、...からFloatなど、NSNumberサブクラスのインスタンスに多くの型が自動的に「ブリッジ」されました。

Swift 3以降、その変換を明示的にする必要があります。

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

または、NSManagedObjectサブクラスを作成するときにオプション "プリミティブデータ型にスカラープロパティを使用する"を使用すると、プロパティはNSNumberではなく整数型になり、変換せずに取得および設定できます。

55
Martin R

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)
5
danieltmbr

Swift 4

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

または元のコードのままにして、割り当てを変更するだけで機能します:

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

Swift 2でコードが正常に機能するため、これは次の更新で変更される可能性のある動作であると予想されます。

2
jboi

Swift 4.2

item.index = Int(truncating: currentIndex)
0
FuatK