No Swift, como estender as typealias?

11

Eu tenho um typealias:

typealias BeaconId = [String: NSObject]

Eu gostaria de estendê-lo fazendo algo como:

extension BeaconId {}

Mas isso gera um erro de compilação:

  

A extensão restrita deve ser declarada no tipo genérico não especializado 'Dicionário' com restrições especificadas por uma cláusula 'where'

Então acabo fazendo:

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

Existe uma maneira mais limpa de fazer isso?

    
por guptron 18.11.2015 в 04:34
fonte

1 resposta

4

AFAIK, não.

Considere o seguinte exemplo:

typealias Height: Float

extension: Height {

}

Aqui Height não é um novo tipo, é apenas um rótulo para Float , por isso você está apenas estendendo Float . Se você der uma olhada em Dictionary , é public struct Dictionary<Key : Hashable, Value> : CollectionType, DictionaryLiteralConvertible , então o que você está tentando alcançar com

extension BeaconID {}

está adicionando uma extensão a Dictionary com parâmetros genéricos específicos.

O que eu esperaria que você fosse capaz de fazer é:

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

mas isso também não compila e isso porque no Swift você não pode digitar tipos parciais (em outras palavras, tipos genéricos sem tipos específicos de parâmetros genéricos. Veja aqui para mais informações). Uma possível solução alternativa para tipalizar tipos genéricos, que é observada abaixo da resposta à qual eu me associei, é

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

mas, mesmo assim, quando você tenta estender BeaconID , recebe um aviso do compilador, que finalmente chega ao cerne do problema:

"Extensão restrita deve ser declarada no tipo genérico não especializado 'Dicionário' com restrições especificadas por uma cláusula 'where'"

    
por barndog 18.11.2015 / 04:59
fonte