检查对象是否不是迅速类型

时间:2019-02-16 21:02:37

标签: ios swift iphone

我需要检查对象是否不是某种类型。我知道在Kotlin中可以通过使用!is来检查类型是否不是。我想知道Swift中是否有等效功能,或者在无法解决的情况下可以使用的解决方法?

科特林的例子:

假设动物是不同动物的接口,并且有实现它的类,例如CatDogHorseSpider

var animals = listOf<Animals>(Horse(), Cat(), Dog(), Spider())
var chosenAnimals = animals.filter { it !is Spider }

5 个答案:

答案 0 :(得分:2)

使用快速语法是实现此目的的一种方法

df = data.frame(ID, Test1, Test2, Test3, stringsAsFactors=F)
df <- mutate(df, Test4 = ifelse('Detected' %in% c(Test1, Test2, Test3), 'Detected', 'Negative'))

  ID        Test1        Test2        Test3    Test4
1  1     Detected     Detected Not Detected Detected
2  2 Not Detected Not Detected     Detected Detected
3  3     Detected     Detected Not Detected Detected
4  4     Detected     Detected Not Detected Detected

或者

let animals: [Animals] = [Horse(), Cat(), Dog(), Spider()]
var chosenAnimals = animals.filter { type(of: $0) != Spider.self }

答案 1 :(得分:2)

或者,您可以创建自己的isnot函数,如下所示:

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

答案 2 :(得分:1)

您可以使用此:

var chosenAnimals = animals.filter({!($0 is Spider)})

答案 3 :(得分:1)

这是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) }

根据您的喜好填写协议/类:

答案 4 :(得分:0)

Swift中没有等效项,但它的对应项是is运算符。您只需要取反运算符结果即可。

var animals = listOf<Animals>(Horse(), Cat(), Dog(), Spider())
var chosenAnimals = animals.filter { !($0 is Spider) }

或者,当您使用变异集合(var)时,可以使用removeAll(where:)

var animals = listOf<Animals>(Horse(), Cat(), Dog(), Spider())
animals.removeAll(where: { $0 is Spider })
print("Animals: \(animals)") // should not contain Spider instances
相关问题