9

それらはどう違いますか?似たような概念のように見えるので、少し混乱します。

それらを理解することは、コンパイル時間の最適化にどのように役立ちますか?

4

1 に答える 1

31

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
}

TIntDoubleInt64などの数値であれば何でもかまいません。

ただし、入力するとすぐにlet h = Helper(num: 10)、コンパイラはそれTInt. DoubleInt64、その関数はもう受け入れられadderません。のみ受け付けIntます。

これもまた、型推論と型安全性によるものです。

  • type-in​​ference:ジェネリックが type であることを推測する必要があるためIntです。
  • 型安全性:Tが type に設定されるとInt、もはや受け入れられなくなるためInt64Double...

スクリーンショットでわかるように、署名はタイプのパラメーターのみを受け入れるように変更されましたInt ここに画像の説明を入力

コンパイラのパフォーマンスを最適化するためのヒント:

コードで実行する必要がある型の推論が少ないほど、コンパイルが速くなります。したがって、コレクション リテラルを避けることをお勧めします。そして、コレクションが長くなればなるほど、型の推論が遅くなります...

悪くない

let names = ["John", "Ali", "Jane", " Taika"]

良い

let names : [String] = ["John", "Ali", "Jane", " Taika"]

詳細については、この回答を参照してください。

また、Swift のコンパイル時間がとても遅いのはなぜですか?も参照してください。

このソリューションにより、彼のコンパイル時間は 10/15 秒から 1 秒に短縮されました。

于 2016-06-08T15:56:50.090 に答える