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
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.
Dans Swift 4 (et il pourrait en être de même dans Swift 3)) NSNumber(integer: Int)
a été remplacé par NSNumber(value: )
où 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)
Swift 4:
var currentIndex:Int = 0
for item in self.selectedFolder.arrayOfTasks {
item.index = NSNumber(value: currentIndex) // <--
currentIndex += 1
}
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.
Swift 4.2
item.index = Int(truncating: currentIndex)