0

我正在学习 Swift,但无法理解为什么这段代码是正确的:

enum Test1: String {
    case value
}

let test1 = Test1.value.rawValue

但这一个是不正确的,并向我显示错误

struct MyStruct {
}

extension MyStruct: Equatable {
    static func == (lhs: MyStruct, rhs: MyStruct) -> Bool {
        return true
    }
}

enum Test2: MyStruct {
    case value
}

我浏览Swift.String了来源,没有找到rawValue声明。它在 Swift 中是如何工作的?是String“自动”符合的内置类型RawRepresentable,但所有其他类型都必须显式声明其符合性?

4

2 回答 2

1

请注意,Test.value有类型Test1,而不是String

有特殊处理(隐式符合RawRepresentable),但它适用于字符串值枚举,而不是String它本身。

于 2021-11-26T03:08:57.190 回答
0

原始值可以是字符串、字符或任何整数或浮点数类型。每个原始值在其枚举声明中必须是唯一的。

https://docs.swift.org/swift-book/LanguageGuide/Enumerations.html


但这仅适用于使用基于冒号的快捷语法。手动符合也没问题。

enum Test2 {
  case value
}

extension Test2: RawRepresentable {
  init?(rawValue: MyStruct) {
    self = .value
  }
  
  var rawValue: MyStruct { .init() }
}
于 2021-11-26T02:57:50.637 回答