Работа со значениями NSNumber и Integer в Swift 3
Я пытаюсь преобразовать свой проект в Swift 3.0, однако при работе с NSNumber
и Integers
у меня возникают два сообщения об ошибках.
Невозможно назначить тип int для ввода NSNumber
для
//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
}
и даже когда я изменяю currentIndex
на тип NSNumber
, тогда я получаю ошибку
Двоичный оператор '+ =' не может применяться для типа "NSNumber" и "Int"
поэтому я создаю свойство one
типа NSNumber
для добавления в currentIndex
, но затем получите следующую ошибку;
Двоичный оператор '+ =' не может применяться к двум операндам NSNumber
& & вторая ошибка, которую я получаю, это
Нет '+' кандидатов вызывают ожидаемый тип контекстного результата NSNumber
let num: Int = 210
let num2: Int = item.points.intValue
item.points = num + num2
Здесь я просто пытаюсь добавить 210 к значению свойства points, item
- это NSManagedObject
.
Итак, в основном у меня возникают проблемы с добавлением чисел в свойства типа NSNumber
. Я работаю с NSNumber
, потому что они являются свойствами NSManagedObject
.
Может ли кто-нибудь помочь мне? У меня более 80 ошибок, которые являются либо одной из вышеупомянутых ошибок.
Спасибо
Ответы
Ответ 1
Перед тем, как Swift 3, многие типы автоматически "соединялись" с
экземпляр некоторого подкласса NSObject
, где это необходимо, например String
to
NSString
или Int
, Float
,... до NSNumber
.
С Swift 3 вы должны сделать это преобразование явным:
var currentIndex = 0
for item in self.selectedFolder.arrayOfTasks {
item.index = currentIndex as NSNumber // <--
currentIndex += 1
}
В качестве альтернативы при создании подкласса NSManagedObject
используйте параметр "Использовать скалярные свойства для примитивных типов данных",
то свойство имеет некоторый целочисленный тип вместо NSNumber
,
так что вы можете получить и установить его без преобразования.
Ответ 2
Вы должны остаться с оригинальным кодом и просто изменить назначение, чтобы оно работало:
var currentIndex = 0
for item in self.selectedFolder.arrayOfTasks {
item.index = NSNumber(integer: currentIndex)
currentIndex += 1
}
Как ваш код отлично работает в Swift 2, я ожидаю, что это поведение, которое может измениться в следующем обновлении.
Ответ 3
В Swift 4 (и это может быть то же самое в Swift 3) NSNumber(integer: Int)
был заменен на NSNumber(value: )
, где value
может быть любым почти любым типом числа:
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)
Ответ 4
Swift 4:
var currentIndex:Int = 0
for item in self.selectedFolder.arrayOfTasks {
item.index = NSNumber(value: currentIndex) // <--
currentIndex += 1
}