枚举模式匹配作为函数调用的参数

时间:2018-09-17 08:40:02

标签: swift enums

我用一个例子建立了一个游乐场:

enum CarType : Equatable {
    case wheeled(wheels: Int)
    case flying

    public static func ==(lhs: CarType, rhs: CarType) -> Bool {
        return lhs.enumName == rhs.enumName
    }

    var enumName: String {
        let stuff = "\(self)".split(separator: "(").first!
        return String(describing: stuff)
    }

}


var typesPresentAtMyParty = [CarType.wheeled(wheels:4), .wheeled(wheels:4), .flying]

let aKnownType = CarType.flying

if case aKnownType = typesPresentAtMyParty[2] {
    print("Was the type")
}

func isPresent(type: CarType, inArray: [CarType]) -> Bool {

    return inArray.filter {
        if case type = $0 {
            return true
        }
        return false
    }.first != nil

}

func isWheeled(inArray: [CarType]) -> Bool {

    return inArray.filter {
        if case .wheeled = $0 {
            return true
        }
        return false
        }.first != nil

}


isPresent(type: .flying, inArray: typesPresentAtMyParty)
isPresent(type: .wheeled, inArray: typesPresentAtMyParty) 

这里的最后一行不编译。尽管我可以if case .wheeled = $0忽略关联类型作为检查,但是在发送isPresent(type: CarType, inArray: [CarType])

时,我无法在函数调用isPresent(type: .wheeled, inArray: typesPresentAtMyParty)中找到相同的方法

是否有一种编写仅将枚举的有效模式匹配部分作为参数的函数的方法?

1 个答案:

答案 0 :(得分:0)

不可能将部分构造的枚举传递给函数。部分构造的枚举不是有效值,它们仅在模式匹配中起作用,因为编译器有一个具体的值可以使用-模式右侧的值。

这就是说,您可以轻松地将函数重写为更好,更快捷的版本。

首先,您不需要isPresent,只需使用contains即可。

typesPresentAtMyParty.contains { $0 == .flying }
typesPresentAtMyParty.contains { if case . wheeled = $0 { return true } else { return false } } 

类似地,isWheeled可以缩短(并重新命名,以获得更好的语义):

func isWheeled(_ carType: CarType) -> Bool {
    if case . wheeled = carType { return true } else { return false }
}

可以通过pe传递给contains

let hasWeeled = typesPresentAtMyParty.contains(where: isWheeled)