2017-03-16 3 views
2

私は、識別子(クラス名)静的計算変数をUITableViewCell拡張で定義し、サブクラスを汎用関数に送信して識別子にアクセスしようとしています。Swift 3を使って汎用関数で計算された変数のサブクラスのバージョンを取得するにはどうすればよいですか?

Subclass.identifierにアクセスすると、私はサブクラスの名前を取得しますが、一般的な機能から、それをアクセスするとき、それはUITableViewCellの

コードを返します。

protocol Identifiable { 
    static var identifier: String { get } 
} 

extension Identifiable { 
    static var identifier: String { return String(describing: Self.self) } 
} 

extension UITableViewCell: Identifiable { } 

class Subclass: UITableViewCell { 

} 

print("\(Subclass.identifier)") // Output: "Subclass" 

func blah<T: Identifiable>(_ cellType: T.Type) { 
    print("\(cellType.identifier)") 
} 
blah(Subclass.self) // Output: "UITableViewCell" 

をどのようにサブクラスを得ることができます私のUITableViewのすべてのサブクラスで識別可能なプロトコルに準拠する必要はありません。

+0

関連[なぜ静的関数では、 http://stackoverflow.com/questions/42037852/why-do-self-and-self-sometimes-refer-to-different-types-in-static-functions)。表示されている動作は、「メソッドがプロトコル要件である場合の実在」動作です。 「自己」の価値を決める要素の複雑さが非常に複雑であるため、「自己」が常に好ましい。 – Hamish

答えて

2

Selfは不要です。あなたが欲しい:

extension Identifiable { 
    static var identifier: String { return String(describing: self) } 
} 

あなたは「このクラスの自己」と「このクラスでは、」あなたは(UITableViewCellのである)を拡張してきましたものであると言っているSelf.selfを言うとき。あなたはちょうどselfと言うとき、「このこと」が「このこと」が関数を実行しているものであると言っているのですが、Subclass

関連する問題