Converting Int to Bool
Solution 1
No, there is and has never been an explicit built in option for conversion of Int
to Bool
, see the language reference for Bool
for details.
There exists, still, however, an initializer by NSNumber
. The difference is that implicit bridging between Swift numeric type and NSNumber
has been removed in Swift 3 (which previously allowed what seemed to be explicit Bool
by Int
initialization). You could still access this by NSNumber
initializer by explicitly performing the conversion from Int
to NSNumber
:
let number = 1
let result = Bool(number as NSNumber)
print(result) // true
As @Hamish writes in his comment below: if we leave the subject of initializers and just focus on the end result (instantiating a Bool
instance given the value of an Int
instance) we can simply make use of the !=
operator for Int
values (specifically, the operator with signature func !=(lhs: Int, rhs: Int) -> Bool
), a generalization easily achievable using the !=
operator approach:
let number = -1
let result = number != 0
print(result) // true
Much like you yourself as well as @JAL describes in his answer, you could construct your own Bool
by Int
initializer, but you might as well consider generalizing this for any type conforming to the Integer
protocol:
extension Bool {
init<T: Integer>(_ num: T) {
self.init(num != 0)
}
}
/* example usage */
let num1: Int8 = -1
let num2: Int = 3
let num3: UInt64 = 0
// ....
let result1 = Bool(num1) // true
let result2 = Bool(num2) // true
let result3 = Bool(num3) // false
Solution 2
Swift 4
extension Int {
var boolValue: Bool { return self != 0 }
}
Swift 3
extension Integer {
var boolValue: Bool { return self != 0 }
}
Usage
let number = 2
print(number.boolValue)
let items = ["1"]
print(items.count.boolValue)
Solution 3
There is no Boolean initializer that takes an Int
, only NSNumber
. Previously, the Int
was implicitly bridged to NSNumber
through Foundation, but that was removed in Swift 3.
You can do something like:
let result = Bool(number as NSNumber)
Or, you can extend Bool
and create a custom init that takes an Int:
extension Bool {
init(_ number: Int) {
self.init(number as NSNumber)
}
}
Solution 4
I'm using Xcode 9.0.1 and Swift 3.0.
let result = (number as NSNumber).boolValue
which is working very well for me.
Solution 5
Swift 5
let number = 1
let result = Bool(truncating: number as NSNumber) //here result will be false if the number's value is 0 and it will be true for any other number's value
print(result)
Henny Lee
Updated on May 01, 2020Comments
-
Henny Lee almost 4 years
In Swift 2.x I believe I could do:
let number = 1 let result = Bool(number) print(result) // prints out: true
But since Swift 3 I've been unable to do this and it gives me the error:
Cannot invoke initialiser for type 'Bool' with an argument list of type '(Int)'
Currently I'm using an extension to convert an
Int
to aBool
but I was wondering if there isn't a build in option to do this.