2015-11-18 10 views
9

Ho un typealias:In Swift, come estendere un typealias?

typealias BeaconId = [String: NSObject] 

mi piacerebbe estenderlo facendo qualcosa di simile:

extension BeaconId {} 

Ma questo genera un errore di compilazione:

Constrained extension must be declared on the unspecialized generic type 'Dictionary' with constraints specified by a 'where' clause

Così finisco up:

extension Dictionary where Key: StringLiteralConvertible, Value: NSObject {} 

Esiste un modo più pulito per fare ciò?

+1

ho cercato di ripulire il codice e in realtà ottenuto questo errore: 'estensione vincolato deve essere dichiarato sul tipo generico non specificato 'Dizionario' con vincoli specificati da un 'dove' cl ause' – BallpointBen

+0

Sì, ho capito bene, puoi controllare la mia risposta completa qui sotto. In sostanza non sembra possibile estendere tipi generici specifici, solo quelli in cui i tipi generici non sono ancora stati impostati. – barndog

+0

@Robert ciò che mi piacerebbe vedere in Swift 3 non sono solo i vincoli sui protocolli e l'ereditarietà, ma anche sui valori, quindi qualcosa come "estensione SomeEnum dove Self == .MyCase'. In questo modo la funzionalità potrebbe essere definita solo su casi enum specifici. – barndog

risposta

2

AFAIK, n.

consideri il seguente esempio:

typealias Height: Float 

extension: Height { 

} 

Qui Height non è un nuovo tipo, è solo un'etichetta per Float quindi sei solo estendendo Float. Se si dà un'occhiata a Dictionary è public struct Dictionary<Key : Hashable, Value> : CollectionType, DictionaryLiteralConvertible così che cosa si sarebbe cercando di raggiungere con

extension BeaconID {} 

è l'aggiunta di una proroga per Dictionary con specifici parametri generici.

quello che mi aspetterei che si dovrebbe essere capaci di fare è:

typealias BeaconID = Dictionary<Key: String, Value: NSObject> 

ma che anche non compila e questo perché a Swift si può non typealias tipi parziali (in altre parole i tipi generici, senza tipi di parametri generici specifici. Per ulteriori informazioni, vedere here. Una soluzione possibile per typealiasing tipi generici che viene indicato di seguito la risposta che ho legato alla è

struct Wrapper<Key: Hashable, Value> { 
    typealias T = Dictionary<Key, Value> 
} 
typealias BeaconID = Wrapper<String, NSObject>.T 

ma anche allora, quando si tenta di estendere BeaconID, si ottiene un avviso del compilatore, che ottiene finalmente al cuore del problema:

"estensione vincolata deve essere dichiarato il tipo generico non specializzato 'Dizionario' con i vincoli previsti da un 'dove' la clausola"

Problemi correlati