web-dev-qa-db-fra.com

Utilisation des valeurs NSNumber & Integer dans Swift 3

J'essaie de convertir mon projet en Swift 3.0. Toutefois, je rencontre deux messages d'erreur lorsque je travaille avec NSNumber et Integers.

Impossible d'affecter le type int au type NSNumber

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
 }

et même quand je change currentIndex en un type NSNumber, alors j'obtiens l'erreur

L'opérateur binaire '+ =' ne peut pas être appliqué aux types 'NSNumber' et 'Int'

alors je crée une propriété appelée one de type NSNumber à ajouter à currentIndex mais j'obtiens l'erreur suivante;

L'opérateur binaire '+ =' ne peut pas être appliqué à deux opérandes NSNumber

&& la deuxième erreur que je reçois est

Aucun candidat '+' ne produit le type de résultat contextuel attendu NSNumber

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

Ici, j'essaie simplement d'ajouter 210 à la valeur de la propriété de points, item est un NSManagedObject.

En gros, j'ai du mal à ajouter des nombres à des propriétés de type NSNumber. Je travaille avec NSNumber car ce sont des propriétés de NSManagedObject.

Quelqu'un peut m'aider ? J'ai plus de 80 erreurs qui sont toutes l'une des erreurs mentionnées ci-dessus.

Merci

33
A.Roe

Avant Swift 3, de nombreux types étaient automatiquement "pontés" vers une instance d'une sous-classe NSObject si nécessaire, telle que String à NSString , ou Int, Float, ... à NSNumber.

À partir de Swift 3, vous devez expliciter cette conversion:

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

Vous pouvez également utiliser l'option "Utiliser les propriétés scalaires pour les types de données primitifs" lors de la création de la sous-classe NSManagedObject. La propriété a alors un type entier au lieu de NSNumber, afin que vous puissiez l'obtenir et la définir sans conversion.

55
Martin R

Dans Swift 4 (et il pourrait en être de même dans Swift 3)) NSNumber(integer: Int) a été remplacé par NSNumber(value: )value peut être n'importe quel type de nombre:

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

Vous devez rester avec ou le code original et simplement changer l'affectation, pour que cela fonctionne:

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

Comme votre code fonctionne bien dans Swift 2, je suppose que ce comportement pourrait changer dans la prochaine mise à jour.

2
jboi

Swift 4.2

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