2016-01-08 1 views
2

Dans le guide de programmation Swift d'Apple, il est décrit comment utiliser le mot-clé typealias dans les protocoles (de la section sur Generics)Utilisation de la syntaxe de typealias dans les protocoles dans la bibliothèque standard Swift

protocol Container { 
    typealias ItemType 
    mutating func append(item: ItemType) 
    var count: Int { get } 
    subscript(i: Int) -> ItemType { get } 
} 

qui est alors mis en œuvre:

struct IntStack: Container { 
    typealias ItemType = Int // can sometimes be left out and inferred by the compiler 
    mutating func append(item: Int) { 
    self.push(item) 
    } 

// redacted 
} 

Cependant, un cas d'utilisation sensiblement différente se trouve dans le répertoire lib norme Swift, par exemple

public protocol ForwardIndexType : _Incrementable { 

typealias Distance : _SignedIntegerType = Int 

// redacted 

} 

ou

public protocol CollectionType : Indexable, SequenceType { 

typealias Generator : GeneratorType = IndexingGenerator<Self> 
public func generate() -> Self.Generator 

// redacted 

} 

avec:

extension CollectionType where Generator == IndexingGenerator<Self> { 
    public func generate() -> IndexingGenerator<Self> 
} 

Qu'est-ce que cette syntaxe représente? Il semble que les typealias soient à la fois déclarées, restreintes (par exemple à GeneratorType) et assignées, à la fois? Qu'est-ce que cela signifie et pourquoi est-ce vrai? Je m'attendais à voir assignation (=) uniquement dans l'implémentation du code client. Ma compréhension de typealias est qu'il représente un type, qui est "rempli" par le code d'implémentation (comme par générique) mais ici il semble implémenter un type pour les typealias dans la déclaration, même si c'est aussi fait dans l'extension (où je m'y attendais).

Répondre

1

Jetez un oeil à this answer. L'utilisation d'un deux-points montre l'héritage, l'utilisation d'un signe égal montre l'assignation.

Dans ma compréhension, cela signifie les éléments suivants:

typealias X // defines associated type X for subclasses to override 
typealias X: Y // defines associated type X and requires that it conform to Y 
typealias X = Z // defines associated type X with a default of type Z 
typealias X: Y = Z // defines associated type X with a default of type Z and requires that any overrides conform to Y 

Mon interprétation semble être soutenue par this article sur les génériques Swift:

Un type associé est déclaré par un protocole en utilisant les typealias mot-clé . Il est normalement défini par un élément qui se conforme à ce protocole, , bien que vous puissiez fournir une valeur par défaut. Comme paramètres de type, un type associé peut être utilisé comme un jeton lors de la construction type générique règles.

L'utilisation du mot-clé typealias peut induire en erreur pour définir les types associés et peuvent être remplacés par associatedtype dans the future.

+1

'typealias X = Z' dans une définition de protocole n'attribue pas un alias. Il définit un type associé 'X' avec la valeur par défaut' Z'. –

+1

@MartinR C'est vrai, j'ai mal formulé ça. Je vais le corriger. Merci! – ColGraff

+0

Étant donné que Generics sont conçus pour être bien, générique ... Je ne suis toujours pas à 100% sur la raison pour laquelle la capacité existe d'avoir une valeur par défaut pour un type associé, mais quand même. – Brynjar