Подтвердить что ты не робот

Работа со значениями 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 ошибок, которые являются либо одной из вышеупомянутых ошибок.

Спасибо

4b9b3361

Ответ 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
}