Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Working with NSNumber & Integer values in Swift 3

I am trying to convert my project to Swift 3.0 however I am having two error messages when working with NSNumber and Integers.

Cannot assign type int to type NSNumber

for

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

and even when I change currentIndex to a type NSNumber then I get the error

Binary operator '+=' cannot be applied to type 'NSNumber' and 'Int'

so then I create a property called one of type NSNumber to add to currentIndex but then get the following error;

Binary operator '+=' cannot be applied to two NSNumber operands

&& the second error I get is

No '+' candidates produce the expected contextual result type NSNumber

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

Here I am just trying to add 210 to the points property value, item is a NSManagedObject.

So basically I am having issues getting my head around adding numbers to properties of type NSNumber. I am working with NSNumber because they are properties of NSManagedObject's.

Can anyone help me out ? I have over 80 errors which are all either one of the above errors mentioned.

Thanks

like image 351
A.Roe Avatar asked Sep 04 '16 20:09

A.Roe


People also ask

Why use NSNumber?

The purpose of NSNumber is simply to box primitive types in objects (pointer types), so you can use them in situations that require pointer-type values to work. One common example: you have to use NSNumber if you want to persist numeric values in Core Data entities.

What is NSNumber?

Overview. NSNumber is a subclass of NSValue that offers a value as any C scalar (numeric) type. It defines a set of methods specifically for setting and accessing the value as a signed or unsigned char , short int , int , long int , long long int , float , or double or as a BOOL .

What is NSString?

A static, plain-text Unicode string object that bridges to String ; use NSString when you need reference semantics or other Foundation-specific behavior.

What is CGFloat in Swift?

Swift version: 5.6. A CGFloat is a specialized form of Float that holds either 32-bits of data or 64-bits of data depending on the platform. The CG tells you it's part of Core Graphics, and it's found throughout UIKit, Core Graphics, Sprite Kit and many other iOS libraries.


1 Answers

Before Swift 3, many types were automatically "bridged" to an instance of some NSObject subclass where necessary, such as String to NSString, or Int, Float, ... to NSNumber.

As of Swift 3 you have to make that conversion explicit:

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

Alternatively, use the option "Use scalar properties for primitive data types" when creating the NSManagedObject subclass, then the property has some integer type instead of NSNumber, so that you can get and set it without conversion.

like image 109
Martin R Avatar answered Oct 05 '22 14:10

Martin R