Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Checking if object is not of type in swift

Tags:

ios

swift

iphone

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 }
like image 824
user2759839 Avatar asked Feb 16 '19 21:02

user2759839


5 Answers

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
like image 151
Alejandro Iván Avatar answered Sep 17 '22 14:09

Alejandro Iván


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
like image 43
Daniel Avatar answered Sep 16 '22 14:09

Daniel


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) }
like image 43
Joakim Danielson Avatar answered Sep 18 '22 14:09

Joakim Danielson


you can use this:

var chosenAnimals = animals.filter({!($0 is Spider)})
like image 41
AppleCiderGuy Avatar answered Sep 17 '22 14:09

AppleCiderGuy


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 :)

like image 32
nielsbot Avatar answered Sep 16 '22 14:09

nielsbot