それらはどう違いますか?似たような概念のように見えるので、少し混乱します。
それらを理解することは、コンパイル時間の最適化にどのように役立ちますか?
それらはどう違いますか?似たような概念のように見えるので、少し混乱します。
それらを理解することは、コンパイル時間の最適化にどのように役立ちますか?
Swift自身のドキュメントから:
Swift は型安全な言語です。タイプ セーフな言語を使用すると、コードで使用できる値のタイプを明確にすることができます。コードの一部で String が必要な場合、誤って Int を渡すことはできません。
var welcomeMessage: String
welcomeMessage = 22 // this would create an error because you
//already specified that it's going to be a String
必要な値の型を指定しない場合、Swift は型推論を使用して適切な型を計算します。型推論により、コンパイラは、指定した値を調べるだけで、コードをコンパイルするときに特定の式の型を自動的に推測できます。
var meaningOfLife = 42 // meaningOfLife is inferred to be of type Int
meaningOfLife = 55 // it Works, because 55 is an Int
型安全性と型推論を一緒に
var meaningOfLife = 42 // 'Type inference' happened here, we didn't specify that this an Int, the compiler itself found out.
meaningOfLife = 55 // it Works, because 55 is an Int
meaningOfLife = "SomeString" // Because of 'Type Safety' ability you will get an
//error message: 'cannot assign value of type 'String' to type 'Int''
次のプロトコルを想像してください
protocol Identifiable {
associatedtype ID
var id: ID { get set }
}
次のように採用します。
struct Person: Identifiable {
typealias ID = String
var id: String
}
ただし、次のように採用することもできます。
struct Website: Identifiable {
var id: URL
}
を取り除くことができますtypealias
。コンパイラは引き続き型を推測します。
詳細については、ジェネリック - 関連付けられた型を参照してください。
Swift の型推論のおかげで、IntStack の定義の一部として Int の具体的な Item を実際に宣言する必要はありません。IntStack は Container プロトコルのすべての要件に準拠しているため、Swift は、append(_:) メソッドの item パラメーターの型と添え字の戻り値の型を調べるだけで、使用する適切な Item を推測できます。実際、上記のコードから typealias Item = Int の行を削除しても、Item に使用するタイプが明確であるため、すべてが機能します。
次のコードがあるとします。
struct Helper<T: Numeric> {
func adder(_ num1: T, _ num2: T) -> T {
return num1 + num2
}
var num: T
}
T
Int
、Double
、Int64
などの数値であれば何でもかまいません。
ただし、入力するとすぐにlet h = Helper(num: 10)
、コンパイラはそれT
がInt
. Double
、Int64
、その関数はもう受け入れられadder
ません。のみ受け付けInt
ます。
これもまた、型推論と型安全性によるものです。
Int
です。T
が type に設定されるとInt
、もはや受け入れられなくなるためInt64
、Double
...スクリーンショットでわかるように、署名はタイプのパラメーターのみを受け入れるように変更されましたInt
コードで実行する必要がある型の推論が少ないほど、コンパイルが速くなります。したがって、コレクション リテラルを避けることをお勧めします。そして、コレクションが長くなればなるほど、型の推論が遅くなります...
悪くない
let names = ["John", "Ali", "Jane", " Taika"]
良い
let names : [String] = ["John", "Ali", "Jane", " Taika"]
詳細については、この回答を参照してください。
また、Swift のコンパイル時間がとても遅いのはなぜですか?も参照してください。
このソリューションにより、彼のコンパイル時間は 10/15 秒から 1 秒に短縮されました。