value of type 'Homebrew' does not conform to expected element type 'AnyObject'
私は、アレイ・ノー種類を与えないとき、私はあいまいなタイプのエラーを取得し、それはより多くの文脈を必要とする。
私は何をしようとしていますか?
私は何度もグーグルで行きましたが、何も見つかりませんでした。
value of type 'Homebrew' does not conform to expected element type 'AnyObject'
私は、アレイ・ノー種類を与えないとき、私はあいまいなタイプのエラーを取得し、それはより多くの文脈を必要とする。
私は何をしようとしていますか?
私は何度もグーグルで行きましたが、何も見つかりませんでした。
@RobNapierのコメントに続いて、を作成しました。両方structs
はid
とcommand
定数を使用するので、私はこの思い付いた:
protocol CKInstall {
var id: String {get}
var command: [String] {get}
}
問題を解決します!
AnyObject
の代わりにAny
を使用してください。
let installers: [Any] = [Homebrew(), Ls()]
上記で提案したように、私はこれを手助けする簡単なプロトコルタイプInstallerTypeを作成しました。 AnyまたはAnyObjectプロトコルに準拠させる代わりに、特定のタイプに準拠させることで、オブジェクトをより良い方法で分類できます。
extension Homebrew: InstallerType { }
extension Ls: InstallerType { }
let installers: [InstallerType] = [Homebrew(), Ls()]
アダムは構文では正しいですが、これはほとんど常に間違ったデザインです。 HomebrewとLsの両方が準拠しているプロトコルがいくつかあるべきです。あなたは 'Any'ではなくそのプロトコルの配列を作るべきです。 'Any'はSwiftの型安全性を破り、たくさんのトリッキーなコーナーケースや微妙なバグを作り出します(特に、ジェネリックやOptionalが関わっている場合)。絶対に必要な場合を除いて避けるべきです。 (これは 'AnyObject'でも同様です。) –
@RobNapier合意。 – Adam