【问题标题】:Enum conforming to protocol with stored property枚举符合具有存储属性的协议
【发布时间】:2017-11-30 21:47:02
【问题描述】:

我正在关注Swift Tour,他们有这个协议示例

protocol ExampleProtocol {
     var simpleDescription: String { get }
     mutating func adjust()
}

那么练习就是

编写一个符合此协议的枚举。

如果我让 Xcode 存根枚举,它会这样做

enum SimpleEnum: ExampleProtocol {
    var simpleDescription: String    
    func adjust() {
    }
    case foo
}

然后它给了我错误“枚举可能不包含存储的属性”。如果我删除该属性,它会给我错误“类型'SimpleEnum'不符合协议'ExampleProtocol'”。

我今天刚开始学习 Swift,所以我不知道正确的方法是什么。

【问题讨论】:

    标签: swift enums swift-protocols


    【解决方案1】:

    好的,所以您得到的错误是因为必须计算所有属性。因此,在您的简单示例中,您可以执行以下操作:

    enum SimpleEnum: ExampleProtocol {
      case foo, bar
    
      var simpleDescription: String {
         switch self {
           case .foo: return "Foo"
           case .bar: return "Bar"
         }
      } 
    
      func adjust() {
    
      }
    
    }
    

    【讨论】:

    • 您也可以使用return "\(self)",它将返回foobar
    • 他们给出的另一个例子是使用var simpleDescription: String = "foo" 实现协议的类。这是计算属性的简写吗?因为它在我看来是存储的。
    • 一个类可以有存储的属性。枚举不能。所以在课堂上你绝对可以说var simpleDescription: String = "foo"
    【解决方案2】:

    正如协议声明所示,simpleDescription 应该是一个只有 getter 的计算属性,因此您应该在 SimpleEnum 中将 simpleDescription 声明为一个计算属性。

    enum SimpleEnum: ExampleProtocol {
        var simpleDescription: String {
            return "\(self)"
        }
        func adjust() {
        }
        case foo, bar
    }
    
    SimpleEnum.foo.simpleDescription //"foo"
    SimpleEnum.bar.simpleDescription //"bar"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-05-24
      • 1970-01-01
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      相关资源
      最近更新 更多