2016-09-04 1 views
19

J'essaye de convertir mon projet en Swift 3.0 cependant j'ai deux messages d'erreur en travaillant avec NSNumber et Integers.Travailler avec les valeurs NSNumber & Integer dans Swift 3

ne peut pas affecter le type int taper NSNumber

pour

//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 à un type NSNumber je reçois l'erreur

Opérateur binaire '+ =' ne peut pas être appliqué pour taper 'NSNumber' et 'Int'

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

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

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

Aucun candidat '+' produire le type de résultat contextuel prévu Numéro NS

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

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

Donc, fondamentalement, j'ai des problèmes pour obtenir ma tête en ajoutant des numéros aux propriétés de type NSNumber. Je travaille avec NSNumber parce que ce sont des propriétés de NSManagedObject.

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

Merci

Répondre

38

Avant Swift 3, de nombreux types étaient automatiquement "pontés" à une instance sous-classe de certains NSObject le cas échéant, comme String à NSString ou Int, Float, ... à NSNumber.

Au Swift 3, vous devez faire ce explicite 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, alors la propriété a un entier tapez au lieu de NSNumber, afin que vous puissiez obtenir et définir sans conversion.

+1

Vous pouvez trouver l'explication complète ici: [SE-0072] (https://github.com/apple/swift-evolution/blob/master/proposals/0072-eliminate-implicit-bridging-conversions.md) – gbitaudeau

3

Vous devez rester avec ou code original et juste modifier l'affectation, de sorte que cela fonctionne:

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

En tant que votre code fonctionne bien dans Swift 2, je pense que cela est comportement qui pourrait changer dans la prochaine mise à jour.

2

Swift 4 (et peut-être même à Swift 3) NSNumber(integer: Int) a été remplacé par NSNumber(value:)value peut y avoir presque tout type de numéro:

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

Swift 4:

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