2016-03-28 130 views
3

我想創建結構實例的一個這樣的數組:是否可以創建一個結構實例數組?

let installers: [AnyObject] = [Homebrew(), Ls()] 

但我得到這個錯誤:

value of type 'Homebrew' does not conform to expected element type 'AnyObject' 

當我給數組沒有類型,我得到一個模棱兩可的錯誤類型和它需要更多的上下文。

是否有可能完成我想要做的事情?

我谷歌搜索了所有,但我找不到任何東西。

+10

請注意,儘管Adam在語法上是正確的,但這幾乎總是錯誤的設計。應該有一些協議,既家釀和Ls符合,你應該使你的協議陣列,而不是'任何'。 「任何」都打破了Swift的類型安全性,並創造了許多棘手的角落案例和微妙的錯誤(特別是涉及泛型或Optionals時)。除非絕對必要,否則應避免使用。 (「AnyObject」同樣如此。) –

+0

@RobNapier同意。 – Adam

回答

2

繼@RobNapier的建議從他的評論,我建立了。因爲無論structs使用idcommand常量,我想出了這個:

protocol CKInstall { 
    var id: String {get} 
    var command: [String] {get} 
} 

問題解決了!

5

對於結構使用Any而不是AnyObject

let installers: [Any] = [Homebrew(), Ls()] 
2

正如Rob在上面提出的,我創建了一個簡單的協議類型InstallerType來幫助您解決這個問題。而不是使其符合Any或AnyObject協議,將其與某種特定類型相符可以更好地對您的對象進行分類。

extension Homebrew: InstallerType { } 
extension Ls: InstallerType { } 

let installers: [InstallerType] = [Homebrew(), Ls()] 
相關問題