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
}