2015-04-27 111 views
2

我試圖做一個簡單的數據類型來存儲視頻或圖像+聲音,但我收到編譯錯誤「使用未聲明的類型」枚舉MovieItemImageItem 。哪裏不對?枚舉中的未聲明類型聲明在同一個文件

struct MovieItem { 
    let movieUrl: NSURL 
} 

struct ImageItem { 
    let imageUrl: NSURL // UIImage? 
    let soundUrl: NSURL 
} 

enum Item { 
    case MovieItem(MovieItem) // Undeclared type: MovieItem 
    case ImageItem(ImageItem) // Undeclared type: ImageItem 
} 
+0

這仍然是一個[懸而未決的問題(https://bugs.swift.org/瀏覽/ SR-169)。如果您不想重命名您的案例或結構,則有一種解決方法。您可以使用封閉模塊限定結構類型名稱。例如,如果在模塊「MyModule」中定義了'struct MovieItem',則應該可以將相應的大小寫爲'case MovieItem(MyModule.MovieItem)'。 – ingoem

回答

8

我覺得編譯器是由您使用的MovieItemstruct的名稱,並通過其作爲Itemcase標籤的使用混淆。如果你改變了case標籤的名稱它應該工作:

struct MovieItem { 
    let movieUrl: NSURL 
} 

struct ImageItem { 
    let imageUrl: NSURL // UIImage? 
    let soundUrl: NSURL 
} 

// Changed MovieItem to Movie and ImageItem to Image and it works 
enum Item { 
    case Movie(MovieItem) 
    case Image(ImageItem) 
} 
+0

就是這樣,很好的發現! – ihatetoregister

+0

有沒有解決這個限制的方法? – bouke

+0

我不這麼認爲。 –

0

看來我的舊回答不好。羅馬有正確的答案。

我正在更新它,所以現在是正確的。

這不會產生錯誤

struct MovieItem { 
    let movieUrl: NSURL 
} 

struct ImageItem { 
    let imageUrl: NSURL // UIImage? 
    let soundUrl: NSURL 
} 

enum Item { 
    case Movie(MovieItem) 
    case Image(ImageItem) 
} 
+0

看起來更乾淨,但它應該工作我的方式呢? – ihatetoregister

+0

它看起來更清潔,但它也沒有相關的價值,我認爲OP的願望... –

+0

是啊,有沒有辦法使用這種方法提取網址(電影,圖像,聲音)? – ihatetoregister

0

你可以用不同的類型名稱聲明typealias(枚舉外)。 這導致在這種情況下,比較模糊和混亂的代碼,但我離開這裏只是考慮其他的選擇:

struct MovieItem { 
    let movieUrl: NSURL 
} 

struct ImageItem { 
    let imageUrl: NSURL // UIImage? 
    let soundUrl: NSURL 
} 

typealias MovieItemType = MovieItem 
typealias ImageItemType = ImageItem 

enum Item { 
    case MovieItem(MovieItemType) 
    case ImageItem(ImageItemType) 
}