2016-03-28 22 views
3

構造体インスタンスの配列を作成することはできますか?</p> <pre><code>let installers: [AnyObject] = [Homebrew(), Ls()] </code></pre> <p>しかし、私はこのエラーを取得する:私はこのような構造体のインスタンスの配列を作成しようとしています

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

私は、アレイ・ノー種類を与えないとき、私はあいまいなタイプのエラーを取得し、それはより多くの文脈を必要とする。

私は何をしようとしていますか?

私は何度もグーグルで行きましたが、何も見つかりませんでした。

+10

アダムは構文では正しいですが、これはほとんど常に間違ったデザインです。 HomebrewとLsの両方が準拠しているプロトコルがいくつかあるべきです。あなたは 'Any'ではなくそのプロトコルの配列を作るべきです。 'Any'はSwiftの型安全性を破り、たくさんのトリッキーなコーナーケースや微妙なバグを作り出します(特に、ジェネリックやOptionalが関わっている場合)。絶対に必要な場合を除いて避けるべきです。 (これは 'AnyObject'でも同様です。) –

+0

@RobNapier合意。 – Adam

答えて

2

@RobNapierのコメントに続いて、を作成しました。両方structsidcommand定数を使用するので、私はこの思い付いた:

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

問題を解決します!

5

AnyObjectの代わりにAnyを使用してください。

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

上記で提案したように、私はこれを手助けする簡単なプロトコルタイプInstallerTypeを作成しました。 AnyまたはAnyObjectプロトコルに準拠させる代わりに、特定のタイプに準拠させることで、オブジェクトをより良い方法で分類できます。

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

let installers: [InstallerType] = [Homebrew(), Ls()] 
関連する問題