関数の戻り値の型は具象のみType
です。
ポイントはタイプです。それ自体で完全に定義されているすべての構造体、クラス、またはプロトコルは純粋な型です。 ただし、プロトコルまたは構造体が T などの別のジェネリック型プレースホルダーに依存する場合、これは部分型です。
タイプは、コンパイラが特定のメモリを割り当てる必要があるデータ構造です。
だから、このようなもの:
let a = Array<T>()
またはlet b = T
、コンパイラがコンパイル時に推測するのに十分な情報ではありません。
したがって、これは機能しません。
extension IntegerType {
func squared () -> IntegerType { // this line creates error
return self * self
}
}
ここで、IntegerType は部分型です。これは、準拠した場合にのみ正確なタイプを知ることができる汎用プロトコルです。アレイに似ています。配列自体は型ではありません。汎用コンテナです。誰かが Array() または Array()... で作成した場合にのみ、型があります。
同じことがあなたにも起こりました。
public protocol IntegerType : _IntegerType, RandomAccessIndexType {
また、
public protocol RandomAccessIndexType : BidirectionalIndexType, Strideable, _RandomAccessAmbiguity {
@warn_unused_result
public func advancedBy(n: Self.Distance) -> Self
また、
public protocol _RandomAccessAmbiguity {
associatedtype Distance : _SignedIntegerType = Int
}
したがって、RandomAccessIndexType は、誰かがそれに準拠するまで、または準拠しない限り、Self 要件の意味を持つため、Self は未知のプレースホルダーです。パーシャルタイプです。
IntegerType は RandomAccessIndexType および _RandomAccessAmbuiguity に準拠しているため、距離関連型も必要です。
したがって、これもできません
let a: IntegerType = 12
ここでも、IntegerType は Self と Distance (associatedType) を知る必要があります。
ただし、Intはそのような詳細を提供します
public struct Int : SignedIntegerType, Comparable, Equatable {
/// A type that can represent the number of steps between pairs of
/// values.
public typealias Distance = Int
したがって、あなたはそのようなことができます
let a:Int = 10
これは、SignedIntegerType に Self を提供し、他の対応するものに Distance を提供するためです。
簡単に言えば:
具象型を使用できる場所で部分型を使用することはできません。部分型は、他のジェネリックとそれらの制約に適しています。