通过元组

时间:2017-08-24 07:51:44

标签: swift swift3

作为switch enum的一个案例,我缺少元组的synatax。

public protocol QueryType {
    var predicate: NSPredicate? { get }
    var sortDescriptors: [SortDescriptor] { get }
}

 public enum Query: QueryType {
        case id(Int)
        case owner(String)
        case isSent(Bool)

        public var predicate: NSPredicate? {

            switch self {
            case .id(let value):
                return NSPredicate(format: "id == %d", value)
            case (.owner(let value1), .isSent(let value2)):
                return NSPredicate(format: "owner == %@ AND isSent == %@", value1, NSNumber(booleanLiteral: value2)
            }
        }

        public var sortDescriptors: [SortDescriptor] {
            return [SortDescriptor(keyPath: "id")]
        }
    }

如果有两个条件我收到错误:"Tuple pattern cannot match values of the non-tuple type 'MyType.Query'"

甚至可能吗?

修改

如何创建case ownerIsSent(String, Bool),然后在switch中创建

case .ownerIsSent(let value1, let value2):
return NSPredicate(format: "owner == %@ AND isSent == %@", value1, NSNumber(booleanLiteral: value2))

提前致谢!

2 个答案:

答案 0 :(得分:2)

这是不可能的。您只能同时切换一个大小写。即使(self, self)也会打开相同的案例。

解决方案可以是添加具有两个关联值的案例,例如

case id(Int)
case owner(String)
case isSent(Bool)
case ownerIsSent(String, Bool)

答案 1 :(得分:2)

编辑可行。我只重命名:

e.g。

case id(Int)
case sentByOwner(String,Bool)

我想使用Query作为谓词的工厂我猜! 然后......我想你可以做到这一点