Reputation: 3072
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 a Bool
but I was wondering if there isn't a build in option to do this.
Upvotes: 38
Views: 48335
Reputation: 8234
something like this. Check if the condition is true and return
let result = number == 1 ? true : false
Upvotes: 0
Reputation: 1052
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)
Upvotes: 5
Reputation: 4256
Swift 5 try this
extension Int32 {
var boolValue: Bool {
return (self as NSNumber).boolValue
}
}
or
extension Int32 {
var boolValue: Bool {
return Bool.init(truncating: NSNumber.init(value: self))
}
}
Upvotes: 0
Reputation: 473
extension Int {
var boolValue: Bool { return self != 0 }
}
extension Integer {
var boolValue: Bool { return self != 0 }
}
let number = 2
print(number.boolValue)
let items = ["1"]
print(items.count.boolValue)
Upvotes: 33
Reputation: 849
let iFalse: Int = 0
let iTrue: Int = 1
let iNil: Int = 2 //or any number other than 0 & 1
Bool(exactly: iFalse as NSNumber) //false
Bool(exactly: iTrue as NSNumber) //true
Bool(exactly: iNil as NSNumber) //nil
Upvotes: 1
Reputation: 6413
I'm using Xcode 9.0.1 and Swift 3.0.
let result = (number as NSNumber).boolValue
which is working very well for me.
Upvotes: 6
Reputation: 73236
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
Upvotes: 64
Reputation: 42489
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)
}
}
Upvotes: 6