7

I have a variable called number of type Int

var number = value!.integerValue as Int

Now I have to create a NSNumber object using that value.

I am trying to use this constructor

value = NSNumber(int: number)

, but it does not work.

It expect the primitive type int, not Int I guess.

Anyone know how to get around this?

Thanks!

3 Answers 3

7

You just do value = number

As you can see in the documentation:

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html

the native swift number types generally bridge directly to NSNumber.

Numbers

Swift automatically bridges certain native number types, such as Int and Float, to NSNumber. This bridging lets you create an NSNumber from one of these types:

SWIFT

let n = 42
let m: NSNumber = n
It also allows you to pass a value of type Int, for example, to an argument expecting an NSNumber. Note that because NSNumber can contain a variety of different types, you cannot pass it to something expecting an Int value.

All of the following types are automatically bridged to NSNumber:

Int
UInt
Float
Double
Bool

Swift 3 update

In Swift 3, this bridging conversion is no longer automatic and you have to cast it explicitly like this:

let n = 42
let m: NSNumber = n as NSNumber
Sign up to request clarification or add additional context in comments.

4 Comments

On Ubuntu Linux, with Swift 3.0.2, this bridging doesn't occur. The prior two lines of code give error: repl.swift:3:19: error: cannot convert value of type 'Int' to specified type 'NSNumber'
@ChrisPrince In Swift 3 this bridging is no longer automatic. You have to cast to an NSNumber by adding as NSNumber in the assignment. Adding it to my answer.
Hmmm. I think there is a difference in Foundation on MacOS and Linux in this regard. Also see stackoverflow.com/questions/43828307/…
NSNumber(value:1)
4

The issue is because in ObjC, an int is a 32 bit number, and an integer or NSInteger is a 64 bit number.

var number = value!.integerValue as Int

Number is of type Int which corresponds to the ObjC type NSInteger

You now try to create with this:

value = NSNumber(int: number)

Which takes an Int32 or int type, thus resulting in failure. You have a few options that will work.

One:

value = NSNumber(int: Int32(number))

Two (probably better):

value = NSNumber(integer: number)

Three (probably best):

As @Dima points out, you can just set it directly because swift automatically converts:

value = number

3 Comments

The first option you mentioned is wrong, I tried that before asking the question here. NSNumber initializer only expect primitive values. Thanks though.
Never mind, I just tried Int instead of Int32, that's why I got error. My bad!
Happens! :) -- I'm gonna remove my comments since we figured it out
4

For Swift 3 you must use:

var convertedNumber = NSNumber(value: numberToConvert)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.