【问题标题】:Enum pattern matching as a parameter to a function call枚举模式匹配作为函数调用的参数
【发布时间】:2018-09-25 05:35:37
【问题描述】:

我已经用一个例子设置了一个游乐场:

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: .wheeled, inArray: typesPresentAtMyParty) 时,我找不到在函数调用isPresent(type: CarType, inArray: [CarType]) 中执行相同操作的方法

有没有一种方法可以编写一个只将枚举的有效模式匹配部分作为参数的函数?

【问题讨论】:

  • 您可以简单地为关联值传递零。或者这会干扰平等检查吗?如果是,那么您可能需要考虑重新设计该检查。
  • 是的,但随机分配一个值不是我想要的,我不想在其中定义一个值,就像在做检查时一样 if case .wheeled = $0
  • 0 不是随机值 :)
  • 具有关联值的枚举就像函数一样,如果需要参数,则需要指定。
  • 那么在if case .wheeled = $0的时候为什么不需要指定呢?

标签: swift enums


【解决方案1】:

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

话虽如此,您可以轻松地将函数重写为更好、更快捷的版本。

首先,你不需要isPresent,你可以简单地使用包含:

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 }
}

可以传递给contains:

let hasWeeled = typesPresentAtMyParty.contains(where: isWheeled)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多