I need to check if an object is not of a certain type. I know in Kotlin it's possible to check if a type is not by using !is
. I was wondering if there was an equivalent in Swift, or a workaround I could use if it's not possible?
Example in Kotlin:
Assume animals is an interface of different animals and there are classes that implement it such as Cat
, Dog
, Horse
, Spider
, etc:
var animals = listOf<Animals>(Horse(), Cat(), Dog(), Spider())
var chosenAnimals = animals.filter { it !is Spider }
There is no equivalent in Swift, but its counterpart is the is
operator. You only need to negate the operator result.
var animals = listOf<Animals>(Horse(), Cat(), Dog(), Spider())
var chosenAnimals = animals.filter { !($0 is Spider) }
Or, as you're using a mutating collection (var
), you could use removeAll(where:)
to remove all Spider
instances to solve your problem.
var animals = listOf<Animals>(Horse(), Cat(), Dog(), Spider())
animals.removeAll { $0 is Spider } // animals.removeAll(where: { $0 is Spider })
print("Animals: \(animals)") // should not contain Spider instances
Or, you can create your own isNot function, like this:
extension Animal {
func isNot<T: Animal>(_ type: T.Type) -> Bool {
return !(self is T)
}
}
print(Horse().isNot(Fish.self)) // prints true
print(Horse().isNot(Horse.self)) // prints false
Using swift syntax this is one way to do this
let animals: [Animals] = [Horse(), Cat(), Dog(), Spider()]
var chosenAnimals = animals.filter { type(of: $0) != Spider.self }
alternatively
var chosenAnimals = animals.filter { !($0 is Spider) }
you can use this:
var chosenAnimals = animals.filter({!($0 is Spider)})
Here's a working sample in Swift:
protocol Animal { }
class Horse : Animal { }
class Cat : Animal { }
class Dog : Animal { }
class Spider : Animal { }
let animals:[Animal] = [Horse(), Cat(), Dog(), Spider()]
let chosen = animals.filter { !($0 is Spider) }
Fill in your protocols/classes however you like :)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With