【问题标题】:Creating a variable whose property must satisfy a constraint创建其属性必须满足约束的变量
【发布时间】:2020-10-29 10:22:45
【问题描述】:

我有一个枚举:MyEnum

enum MyEnum {
  case One
  case Two
}

然后我有一个具有MyEnum 类型属性的类。

class MyClass {
  var myEnum: MyEnum

  init(myEnum: MyEnum) {
    self.myEnum = myEnum
  }
}

现在我有一个MyClass 类型的变量,其MyEnum 属性必须是One。这是我不知道该怎么做的部分。

var myVar: MyClass where { self.myEnum == .One } = MyClass(myEnum: .One) // doesn't work

以下内容不应该像var myInt: Int = "Hello World" 不工作一样工作。

var myVar: MyClass where { self.myEnum == .One } = MyClass(myEnum: .Two)

【问题讨论】:

  • var myVar: MyClass where { self.myEnum == .One } = MyClass(Bool.random() ? .One : .Two) 怎么样?它应该编译还是不编译?如果我在它们之间随机选择,编译器如何提前知道参数是.One还是.Two

标签: swift types enums properties constraints


【解决方案1】:

第一步:我认为我们需要使用断言

var myVar: MyClass = MyClass(.One); assert(myVar.myEnum == .One)

第 2 步:我真的很喜欢 willSet

var myVar: Int? {
    willSet(to) { assert(to == 0) }
}
myVar = 0 // good
myVar = 1 // breaks

第 3 步:将其应用到您的班级:

enum MyEnum {
    case One, Two
}
class MyClass {
    var mustBe: [MyEnum]
    var myEnum: MyEnum {
        willSet(to) { assert(mustBe.contains(to)) }
    }

    init(_ myEnum: MyEnum,_ mustBe: [MyEnum]) {
        self.myEnum = myEnum
        self.mustBe = mustBe
        assert(mustBe.contains(myEnum))
    }
}

var myVar = MyClass(.One, [.One]) // good
myVar.myEnum = .One // good
myVar.myEnum = .Two // breaks

【讨论】:

    猜你喜欢
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多