簡體   English   中英

為什么不能將“類型”用作嵌入在結構中的枚舉的名稱?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM