2016-03-28 30 views
3

Böyle yapı örneklerini dizisi oluşturmak çalışıyorum:Bir dizi yapısal örneği oluşturmak mümkün mü?

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

Ama bu hatayı alıyorum:

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

ben Array türü yok verince, ben belirsiz bir tür hatası aldığınız ve Daha fazla bağlam ihtiyacı var.

Yapmaya çalıştığım şeyi gerçekleştirmek mümkün mü?

Her yere girdim, ancak hiçbir şey bulamıyorum.

+10

Not: Adam sözdiziminde doğru olsa da, bu neredeyse her zaman yanlış tasarımdır. Hem Homebrew hem de Ls'nin uyumlu olduğu bazı protokoller olmalı ve bu protokolün dizisini 'Any' yerine yapmalısınız. “Herhangi biri” Swift'in tip güvenliğini bozar ve pek çok zor köşe durumu ve ince hata oluşturur (özellikle de jenerikler veya Optional'ler dahilse). Kesinlikle gerekli olduğu durumlar dışında kaçınılmalıdır. (Aynı şey "AnyObject" için de geçerlidir.) –

+0

@RobNapier Agreed. – Adam

cevap

2

, ben inşa. Her iki structsid ve command sabitleri kullandığından, ben bu geldi:

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

Sorun çözüldü!

5

Yapılar için AnyObject yerine Any kullanın.

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

Rob'un yukarıda önerdiği gibi, bu konuda size yardımcı olacak basit bir protokol türü olan InstallerType oluşturdum. Herhangi bir veya AnyObject protokolüne uymak yerine, belirli bir türe uygun hale getirmek, nesnelerinizi daha iyi bir şekilde kategorize eder. Onun yorumun @RobNapier 'ın önerisi ardından

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

let installers: [InstallerType] = [Homebrew(), Ls()] 
İlgili konular