2016-03-28 16 views
3

Ich versuche, ein Array von struct Instanzen wie diese zu erstellen:Ist es möglich, ein Array von Strukturinstanzen zu erstellen?

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

Aber ich bekomme diese Fehlermeldung:

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

Als ich dem Array keine Art geben, erhalte ich einen mehrdeutigen Typfehler und dass es mehr Kontext benötigt.

Ist es möglich zu erreichen, was ich versuche zu tun?

Ich googelte überall, aber ich kann nichts finden.

+10

Beachten Sie, dass, obwohl Adam in der Syntax korrekt ist, dies fast immer das falsche Design ist. Es sollte ein Protokoll geben, dem sowohl Homebrew als auch Ls entsprechen, und Sie sollten Ihr Array dieses Protokolls eher als "Any" machen. 'Any 'bricht Swifts Typ Sicherheit und schafft viele knifflige Fälle und subtile Bugs (besonders wenn Generika oder Optionals jemals involviert sind). Es sollte vermieden werden, außer wenn es absolut notwendig ist. (Das gleiche gilt auch für "AnyObject".) –

+0

@RobNapier Vereinbarte. – Adam

Antwort

2

Nach @RobNapier ‚s Vorschlag von seinem Kommentar, baute ich ein . Da beide structs die id und command Konstanten verwenden, kam ich mit auf den Punkt:

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

Problem gelöst!

5

Für Strukturen verwenden Sie Any statt AnyObject.

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

Wie oben von Rob vorgeschlagen, habe ich einen einfachen Protokolltyp InstallerType erstellt, um Ihnen dabei zu helfen. Anstatt es den Any- oder AnyObject-Protokollen anzupassen, würde die Anpassung an einen bestimmten Typ Ihre Objekte besser kategorisieren.

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

let installers: [InstallerType] = [Homebrew(), Ls()] 
Verwandte Themen