2016-08-08 15 views
4

は、このコードを取る:A.selfの使用を避けるには?

protocol P: class { 
static var hello: String { get } 
} 

class A: P { 
    class var hello: String { 
     return "Hello" 
    } 
} 

class B: A { 
    override static var hello: String { 
     return "Hello World" 
    } 
} 

class C: A {} 

class D: C { 
    override static var hello: String { 
     return "Hello D" 
    } 
} 

func sayHello(elements: P.Type...) { 
    for p in elements { 
     print(p.hello) 
    } 
} 

func sayHelloAgain(elements: A.Type...) { 
    for p in elements { 
     print(p.hello) 
    } 
} 

func sayHelloThe3rd(elements: [A.Type]) { 
    for p in elements { 
     print(p.hello) 
    } 
} 

sayHello(A.self, B.self, C.self) 
sayHelloAgain(A.self, B.self, C.self) 

は、私は一つのケースではなく、他にA.selfを使用しなければならないのはなぜ

func register<T: UITableViewCell where T: ReusableView, T: NibLoadableView>(_: T.Type) { ... } 
tableView.register(FoodTableViewCell) 

(このpresentationから取られた)このにそれを比較しますか? また、引数を1つ指定して呼び出すときに.selfを使用する必要はありません。

sayHello(A) 
sayHello(A, B) //doesn't compile 
+2

あなたが参照している古いコードは、 '.self'を追加するべきであるという警告を生成します。以前のバージョンのSwiftでは '.self'が推測され、コンパイラがそれをスティックするケースがありましたが、SwiftはAlexanderが以下のように常に要求するように動いています。 –

答えて

2

.selfはシンタクチック塩である。それは技術的な観点から必要ではないが、それは以下のような多くの場合、タイプミスの結果のコードではエラー、原因となるために存在する:

struct Foo { } 

let foo = Foo 

は、このコードは、どちらかあなたがする必要があることを伝える、あなたのコンパイラエラーになりますがイニシャライザ/関数/メソッド呼び出しを完了するか、タイプを参照する場合は.selfを追加します。

後者の例では、コンテキストは排他的に型および値ではないため、一方を他方と混同する可能性はないため、.selfは必要ありません。

おそらく、関数の宣言を.selfを必要としないように変更する方法がありますが、そのような機能は認識していません。私は調べることに興味があるだろう。

+0

構文上の用語という用語は認識していませんでした。 –

+0

@LescaiIonelまあ、ほとんどの言語はそれらを持っています。たとえば、Swiftでは、switch文に 'fallthrough'キーワードが必要です。これは、間違った暗黙の落ち込みを避けるためです。 'var'は構文上の塩でもあり、潜在的に望ましくない突然変異をユーザーに通知しますが、コードを意図的に明確にします。 – Alexander

関連する問題