[英]Why can't I use 'Type' as the name of an enum embedded in a struct?
以下內容無法編譯:
struct S1 {
enum Type {
case One, Two, Three
}
let e1 : Type
let i : Int
}
func f1(e : S1.Type) {
S1(e1: e, i: 1)
}
錯誤:
error: cannot invoke initializer for type 'S1' with an argument list of type '(e1: S1.Type, i: Int)'
S1(e1: e, i: 1)
^
note: expected an argument list of type '(e1: S1.Type, i: Int)'
S1(e1: e, i: 1)
但是,如果我用其他名稱代替Type
來表示枚舉的名稱,則說Types
,則可以正常編譯。
為什么不能使用Type
作為嵌入在結構中的枚舉的名稱?
您可以這樣進行操作(如前所述,在Swift的內核中也使用Type。這就是為什么編譯器有點困惑)。 如果枚舉未嵌套,則用作名稱的類型有效:
enum Type {
case One, Two, Three
}
struct S1 {
let e1 : Type
let i : Int
}
func f1(e : Type) {
var x = S1(e1: Type.One, i: 1)
}
f1(Type.One)
如果為枚舉使用其他名稱,則仍然可以嵌套它:
struct S2 {
enum Kind {
case One, Two, Three
}
let e1 : Kind
let i : Int
}
func f2(e : S2.Kind) {
var x = S2(e1: S2.Kind.One, i: 1)
}
f2(S2.Kind.One)
史蒂夫是對的,這是一個關鍵詞。 這是規范的相關部分:
在特定上下文中保留的關鍵字:關聯性,便利性,動態,didSet,final,get,infix,inout,懶惰,左,變異,無,非變異,可選,覆蓋,后綴,優先級,前綴,協議,必需,右,設置,輸入type,unown,weak和willSet。 它們在語法中出現的上下文之外,可以用作標識符。
顯然,頂級枚舉類型很好,但嵌入在結構中的一個不是。 類型>元類型類型的語言參考部分說明了原因:
元類型類型
元類型類型是指任何類型的類型,包括類類型,結構類型,枚舉類型和協議類型。
類,結構或枚舉類型的元類型是該類型的名稱,后跟.Type。 協議類型的元類型(不是在運行時符合協議的具體類型)是該協議的名稱,后跟.Protocol。 例如,類類型SomeClass的元類型是SomeClass.Type,協議SomeProtocol的元類型是SomeProtocol.Protocol。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.