Swift 符合协议且具有存储属性的枚举

Swift 符合协议且具有存储属性的枚举,swift,enums,swift-protocols,Swift,Enums,Swift Protocols,我遵循的是,他们有一个协议的例子 protocol ExampleProtocol { var simpleDescription: String { get } mutating func adjust() } 那么这个练习就是 编写符合此协议的枚举 如果我让Xcode去掉枚举,它就会这样做 enum SimpleEnum: ExampleProtocol { var simpleDescription: String func adjust()

我遵循的是,他们有一个协议的例子

protocol ExampleProtocol {
     var simpleDescription: String { get }
     mutating func adjust()
}
那么这个练习就是

编写符合此协议的枚举

如果我让Xcode去掉枚举,它就会这样做

enum SimpleEnum: ExampleProtocol {
    var simpleDescription: String    
    func adjust() {
    }
    case foo
}
然后它给了我一个错误“枚举可能不包含存储的属性”。如果删除该属性,则会出现错误“type'simplenum'不符合协议'ExampleProtocol'”


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

好的,所以您得到的错误是因为必须计算所有属性。因此,在您的简单示例中,您可以这样做:

enum SimpleEnum: ExampleProtocol {
  case foo, bar

  var simpleDescription: String {
     switch self {
       case .foo: return "Foo"
       case .bar: return "Bar"
     }
  } 

  func adjust() {

  }

}

好的,您得到的错误是因为必须计算所有属性。因此,在您的简单示例中,您可以这样做:

enum SimpleEnum: ExampleProtocol {
  case foo, bar

  var simpleDescription: String {
     switch self {
       case .foo: return "Foo"
       case .bar: return "Bar"
     }
  } 

  func adjust() {

  }

}

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

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

SimpleEnum.foo.simpleDescription //"foo"
SimpleEnum.bar.simpleDescription //"bar"

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

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

SimpleEnum.foo.simpleDescription //"foo"
SimpleEnum.bar.simpleDescription //"bar"

您还可以使用
return“\(self)”
返回
foo
bar
另一个示例是使用
var simpleDescription:String=“foo”
实现协议的类。这是计算财产的简写吗?因为在我看来它是存储的。一个类可以有存储的属性。枚举不能。因此,在一个类中,你可以明确地说
var simpleDescription:String=“foo”
。你也可以使用
return“\(self)”
,它将返回
foo
bar
,它们给出的另一个例子是一个使用
var simpleDescription:String=“foo”
实现协议的类。这是计算财产的简写吗?因为在我看来它是存储的。一个类可以有存储的属性。枚举不能。因此,在类中,您可以明确地说
var simpleDescription:String=“foo”