Hata alıyorum "Tür 'Nesnesi' protokolü 'Ana' protokolüne uymuyor. Bu hatayı almamın nedeni, çocukları AnyObject yerine bir Foo dizisi olarak tanımladığımdan kaynaklanabilir. Bu işi yapmak?Sınıfım Swift'teki protokol özellik türünü geçersiz kılabilir mi?
cevap
children
dizi AnyObject
girişlerini kabul etmek gerekir anlamına gelir. Ama Bar
'in çocuklarının sadece Foo
nesnesi olmasını istediğiniz gibi görünüyor.
Bunun yerine, protokolünü verebilir bir associated type:
protocol Parent {
associatedtype Child
var children: [Child] { get set }
}
class Foo { }
class Bar: Parent {
var children = [Foo]()
init() {}
}
protokol alıcı ve tipi [AnyObject] arasında ayarlayıcı böyle bir alıcı ve ayarlayıcı, bu sınıfın değil alt tipi olmak zorunda olduğu anlamına gelir daha orada olduğunu beyan ederse.
Kodunuz ediyorum mantıksal olarak yanlış - örneğin [Foo] değişkenine [sınıf] [Int] (protokolün mümkün olduğunu söyler) belirleyebildiğiniz için (örneğin bu varyasyon var)
Yani bu aslında tek doğru yol.
protocol Parent {
var children: [AnyObject] { get set }
}
class Foo {
}
class Bar: Parent { //error happens here
var children = [AnyObject]()
init() {}
}
Hızlı 2.0 typealias başka bir seçenek olabilir.
Hayır, bir özelliğin türünü değiştiremezsiniz.
sizin çubuk sınıfına ekleyin: protokolde AnyObject Gerektirenvar childrenObject: Foo {
get {
return self.children as! Foo
}
}
her zaman Sınıfındaki bunu belirtmek zorunda AnyObject türü bir dizi isterseniz:
class Bar: Parent {
var children = [AnyObject]()
init() {}
}
ama eğer bir typealias
ile daha spesifik bir protokolü kullanan bu kadar sever protokolü yazabilirsiniz:
protocol Parent {
// in Swift 1 and 2: use `typealias` instead of `associatedtype`
associatedtype T: AnyObject // this makes sure that all instances in the array are definitely of type `AnyObject`/classes
var children: [T] { get set }
}
Bu şekilde sınıf eserlerin senin eski uygunluk ancak bu protokol sadece genel kısıtlaması olarak kullanılabilir ve bu nedenle sadece fonksiyonlarının ve jenerik beyanlarında ki düşünmek zorundayız:
// --- this does work
func someFunc<T: Parent, U: Parent>(p1: T, p2: U) { /* ... */ }
class SomeClass<T: Parent> { /* ... */ }
// --- this doesn't work
let parent: Parent
let array: [Parent]
// here you can only use types which conform to the protocol
// but not the protocol itself as generic arguments
let something = SomeClass<Parent>()
verebilir protokol cevap Alternatif Bazı protokoller size yarar değil. İlgili
class Parent<T : RawRepresentable> where T.RawValue == Int {
var value : T
init(withValue v : T) {
self.value = v
}
}
enum testOne : Int {
case one
case two
}
enum testTwo : Int {
case three
case four
}
class ChildOne : Parent<testOne> {}
class ChildTwo : Parent<testTwo> {}
let c1 = ChildOne(withValue: testOne.one)
print(c1.value)
let c2 = ChildTwo(withValue: testTwo.three)
print(c2.value)
: Tam olarak ne gerekli How in Swift specify type constraint to be enum?
- 1. Meteor absoluteUrl'i geçersiz kılabilir mi?
- 2. Sistem zaman dilimini Ruby'de geçersiz kılabilir miyim?
- 3. Eğer sihirli bir yöntem geçersiz kılabilir miyim?
- 4. Depolanmış bir özellik 'description' ile geçersiz kılma '
- 5. geçersiz kılma temsilci özelliği
- 6. Çalışma kopyasını dizin içeriğine göre geçersiz kılabilir miyim?
- 7. Dosya için kullanılan phpcs kural kümesini geçersiz kılabilir miyim?
- 8. Sass değişkenlerini içe aktarıldıktan sonra geçersiz kılabilir miyim?
- 9. Başvuru sırasında bir parametre tanım nesnesinin özelliklerini geçersiz kılabilir miyim?
- 10. ngmodule.type - null özellik türünü okuyamıyor - main.js
- 11. protokol uzantısı, protokol
- 12. Özellik, sürekli bir özellik mi yoksa (A => B) mi?
- 13. , mac osx üzerinde bir protokol kaydeder mi?
- 14. C# UserControl Görünür Özellik
- 15. Klibi canlandırın: özellik mi?
- 16. Bir değeri açıkça geçirerek CallerMemberName ile atfedilen bir parametrenin otomatik olarak yakalanan değerini geçersiz kılabilir misiniz?
- 17. C# - Geçersiz kılma yönteminin bağımsız değişken türünü değiştir
- 18. Yanlış yükleme geçersiz mi?
- 19. Kategori yöntemleri geçersiz kılınabilir mi? IOS
- 20. CoreData ile, bir @dynamic özelliğime sahipse, geticisini tıpkı @ sentezlendiği gibi geçersiz kılabilir miyim? (Lazy Instantiation)
- 21. Özellik izleme kodunu iyileştirin mi?
- 22. Objective-C'deki özellik geçersiz kılma nedenleri nelerdir?
- 23. Özellik için geçersiz değer <position>
- 24. XCode 4.5 ile özellik geter'i geçersiz kılma
- 25. Protokol, Swift'de bir enum içerdiğinde protokol uyumluluğunu kontrol edin.
- 26. Tüm isim alanını geçersiz mi?
- 27. Clojure'da 'gerektiren' kelimesi geçersiz mi?
- 28. Özel olarak kurallara uygun protokol
- 29. Yaşam boyu parametresiyle ilişkili özellik türünü kullanan ömür boyu hata
- 30. için protokol beyanı bulamıyor 'NSFetchedResultsControllerDelegate'
. Ben Swift'i kontrol eden bir tip hayranım ama bazen bir ton kod oluşturmaya zorluyor. Yazılımımda birçok sınıfım var ve hepsinin aynı özelliği sahiplenmenin sinir bozucu olabileceğini garanti ettikleri zaman tek tek kontrol etmem gerekiyor. – MAH
@MAH Nesneler için ortak işlevler sağlamak için protokolleri de kullanabilirsiniz. “Çocuk” bir protokol olsaydı, o zaman “var çocuklar: [Çocuk]”, “Çocuk” ile uyumlu herhangi bir öğe dizisinden tatmin olabilirdi. İşlevselliği genelleştirmekte özgürsünüz ve ayrı ayrı davaları kontrol etmek zorunda kalmayın! – jtbandes
[Protokol yönelimli programlama] (https://developer.apple.com/videos/wwdc/2015/?id=408) konuşması bir saattir. – jtbandes