ios swift int swift3 nsnumber

ios - Trabajar con NSNumber y valores enteros en Swift 3



nsnumber to int swift (4)

Estoy intentando convertir mi proyecto a Swift 3.0, sin embargo, tengo dos mensajes de error cuando trabajo con NSNumber y Integers .

No se puede asignar el tipo int al tipo NSNumber

para

//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 }

e incluso cuando cambio currentIndex a un tipo NSNumber , NSNumber el error

El operador binario ''+ ='' no se puede aplicar a los tipos ''NSNumber'' e ''Int''

Entonces, creo una propiedad llamada tipo NSNumber para agregarla a currentIndex pero luego currentIndex el siguiente error.

El operador binario ''+ ='' no se puede aplicar a dos operandos NSNumber

&& el segundo error que recibo es

Ningún ''+'' candidato produce el tipo de resultado contextual esperado NSNumber

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

Aquí solo intento agregar 210 al valor de la propiedad de puntos, el item es un objeto NSManagedObject .

Básicamente, tengo problemas para NSNumber en agregar números a las propiedades de tipo NSNumber . Estoy trabajando con NSNumber porque son propiedades de NSManagedObject ''s.

Puede alguien ayudarme ? Tengo más de 80 errores que son todos los errores mencionados anteriormente.

Gracias


Antes de Swift 3, muchos tipos se "puenteaban" automáticamente a una instancia de alguna subclase NSObject donde fuera necesario, como String to NSString , o Int , Float , ... to NSNumber .

A partir de Swift 3 tienes que hacer explícita esa conversión:

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

Alternativamente, use la opción "Usar propiedades escalares para tipos de datos primitivos" al crear la subclase NSManagedObject , luego la propiedad tiene algún tipo de entero en lugar de NSNumber , para que pueda obtenerlo y configurarlo sin conversión.


Debes quedarte con el código original y simplemente cambiar la asignación, para que funcione:

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

Como su código funciona bien en Swift 2, espero que este sea el comportamiento que podría cambiar en la próxima actualización.


En Swift 4 (y podría ser el mismo en Swift 3) NSNumber(integer: Int) fue reemplazado por NSNumber(value: ) donde el value puede ser casi cualquier tipo de número:

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 }