2016-09-17 16 views
5

Peki Swift jenerik sınıf sabitlerini tanımlıyorsunuz?Hızlı bir genel sınıfta statik sabit nasıl tanımlanır?

"normal" bir sınıf için sorun

böyle tanımlayabiliriz:

class C { 
    static let k = 1 
} 

let a = C.k // 1 

Ama genel bir sınıfın aynı yaparsanız:

class C<T> { 
    static let k = 1 
} 

Sen derleme aşağıdaki hatayı alıyorum:

Statik saklanan ürünlerin henüz Peki bu nasıl çözmek için genel türler

desteklenmez?

Şu anda

Bulunduğum çözüm Bunu çözmek için struct kullanıyorum:

struct CConstant { 
    static let K = 1 
} 

Bu genel sınıfın kapsamında tanımlanan ama benim için çalışıyor değildir. Daha iyi bir çözümünüz var mı?

-

ps: bu

cevap

2

Sen fileprivate veya private erişim seviyesi ile küresel sabit tanımlayabilirsiniz) = nedenle gerekli olduğunu düşünüyorum varsa bana bu soruyu yardımcı olun, işte ilk soru Genel sınıfınızın tanımlandığı aynı .swift dosyasında. Yani bu dosyanın dışında görünmeyecek ve global (modül) ad alanını kirletmeyecek.

Geçerli dosyaya dışından bu sabiti erişmek gerekiyorsa o zaman internal (varsayılan erişim seviyesi) ya da public ve isim olarak o ClassConstant gibi pek o Class ile ilgili olduğunu açıkça görülür ilan.

daha yaklaşık access levels in Swift 3 okuyun. Önemsiz değer daktilo sabitler için

+0

Yanıtladığınız için teşekkür ederiz! Öneriniz mevcut çözümümün aynı yönünde görünüyor. Sadece içeriğe bağlı olarak erişimcileri belirtmem gerekiyor. Tam olarak neden "Statik saklanan özelliklerin genel türlerde desteklenmediğini biliyor musunuz?" – ghashi

+0

Tipik parametrelerini belirtmeden jenerik tür kullanamayacağınız için henüz desteklenmediklerini düşünüyorum. Ve bu statik özellik erişmek istiyorsanız 'SomeClass .someConstant' çirkin görünecektir. Türü parametrelerini belirtmeden çalışmasını sağlamak için derleyicide bunu uygulamak gerekir ve bu Swift ekibi için en öncelikli görev değil. – mixel

1

, sadece bir salt okunur statik bilgisayarlı özelliğini uygulamak olabilir: o C<T> statik üyesi olarak, bu 'genel ad alanını' kirletmeden değil yararı vardır

class C<T> { 
    // will be evaluated every time the static property is accessed, 
    // therefore not suited for non-trivial constants. 
    static var k : Int { return 1 } 
} 

let a = C<()>.k // Access k on C<Void> 

. Maalesef, sabiti kullanabilmek için genel bir parametre belirtmeniz gerekir - jenerik parametresi olmayan genel bir sınıf türüne atlayamayacağınız için (statik kapsamdaki herhangi bir şey tanımlanmasını gerektirebilir).

önemsiz olmayan sabitler için

, özel bir küresel sabit tanımlamak ve dış dünyaya maruz için lütfen jenerik sınıfında salt okunur statik bilgisayarlı özelliğini kullanabilirsiniz: Yine

private let _k = SomeClass() 

class C<T> { 
    static var k : SomeClass { return _k } 
} 

, Bu, C<T> üzerinde statik bir üye olarak erişmenize izin verirken, 'genel ad alanı' (tanımladığınız Swift dosyasının dışında olmasa da) kirletmez.

İlgili konular