Можете ли вы (сейчас? Swift5?) Написать «if case» как логическое значение при определении типа, связанного с enum? - PullRequest
0 голосов
/ 31 октября 2019

Допустим, вам нужно определить фактический связанный тип перечисления.

Итак, ситуация, подобная

enum MessageItem: Decodable {

    case a(Images)
    case b(Text)
    case c(Reply)
    ...
}

У меня был такой код

       xSome = x.filter {
            switch $0 {
            case .a(_):
                return false
            case .b(_):
                return true
            case .c(_):
                return true
            }
        }

Но тогда можно было иметь такой код

       xSome = x.filter {
            if case .a = $0 { return false }
            return true
        }

Есть ли теперь какой-нибудь способ, которым Swift сравнивать со связанным типом, производящим логическое значение?

Итак, что-то вроде:

       xSome = x.filter {
            return (case .a = $0)
        }

Итак, что-то вроде anEnum.is( .someCase )

Что-нибудь подобное сейчас в Swift?

(Естественно, я имею в виду без добавления переменной в перечисление, что, конечно,Вы можете сделать.)

1 Ответ

1 голос
/ 31 октября 2019

Перечисления со связанными значениями равны, если вы объявляете их Equatable. Вот состояние игры:

enum MyEnum : Equatable {
    case hey
    case ho
    case heyNonnyNo(String)
}
let e = MyEnum.hey
e == .hey // true
e == .ho // false
// e == .heyNonnyNo // blap, illegal

let e2 = MyEnum.heyNonnyNo("hello")
e2 == .heyNonnyNo("hello") // true
e2 == .heyNonnyNo("goodbye") // true

Почему e == .heyNonnyNo незаконно? Потому что неясно, что это может означать. Этот случай имеет ассоциированное значение;его значение равно связанному значению. Таким образом, мы можем проверить, имеют ли два экземпляра этого случая одинаковое ассоциированное значение, но мы не можем просто спросить (используя ==), является ли экземпляр некоторым ассоциированным значением этого случая.

Так что если это то, что мы хотим знать, мы вернемся к if case:

if case .heyNonnyNo = e2 {
    print("it's a hey nonny no")
}

Но вы не можете сказать это без if (для использования вусловно) потому что if case является ключевым словом;case не может существовать сам по себе. Если вам действительно нужен Bool, вы можете написать его так:

let ok : Bool = {
    switch e2 {
    case .heyNonnyNo: return true
    default: return false
    }
}()
...