同等のものは何ですかSwift以下のObjective-Cコードのコード。Swiftランタイムコンセプトのトピックが見つかりませんでした。
#import <objc/runtime.h>
Class class = [self class];
self
のクラスオブジェクトを取得しようとしていますか?
更新:以下のコードで試して、'UIViewController.type' doesn't conform to protocol 'AnyObject'
var klass: AnyClass = object_getClass(self)
注:見つかった この投稿 しかし、助けにはならなかった。
まず、Objective-Cでそのクラスオブジェクトを何に使用したのかを知らずに、そのコードをSwiftに変換するのは困難です。
Objective-Cでは、クラスオブジェクトはオブジェクトであり、タイプClass
は任意のクラスオブジェクトへのポインターを保持できます。ただし、Objective-C APIがSwiftにブリッジされると、Class
型はSwiftでAnyClass!
に変換されます。ここで、AnyClass
はAnyObject.Type
として定義されます。 Swiftの型はオブジェクトではないため、Objective-Cのクラスオブジェクトと直接同等ではありません。ただし、SwiftからObjective-C APIを使用する場合は、ブリッジされます。とにかくAnyClass
を期待するため、型を渡す必要があります.dynamicType
を使用して、任意の式の型を取得できます。
self.dynamicType
(クラスオブジェクトをSwiftオブジェクトとして、Objective-Cと同じ方法で取得し、Swiftタイプとしてではなく、いくつかの 複雑な方法 もそうするために。)
ただし、問題の説明から別の問題が明らかになります。オブジェクトの型を取得したいだけで、self
がオブジェクトの場合、var klass: AnyClass = object_getClass(self)
はAnyObject
を取り、AnyClass
を返すので、object_getClass()
は機能しているはずです。機能しない唯一の説明は、self
がnotオブジェクトである場合です。あなたのエラーメッセージは、確かに、self
はオブジェクトではなくtypeであることを明らかにしています。
このコードがclassメソッドで実行されている場合、self
はタイプです。コンテキストから外れると誤解しやすいため、コードのコンテキストを実際に指定する必要があります(明らかに、Class class = [self class];
をファイルの最上位に配置していません)。 Objective-C Cocoaには、twoclass
という名前の非常に異なるメソッドがあります。インスタンスメソッド-class
は、オブジェクトのクラス、およびクラスメソッド+class
は、呼び出された(クラス)オブジェクトを単に返すだけです。コードはクラスメソッド内にあるため、Objective-Cでは、self
はクラスオブジェクトを指し、[self class]
はクラスメソッド+class
を実行します。 。つまり、[self class]
はself
とまったく同じです。ずっとself
と書いておくべきでしたが、気づきませんでした。
したがって、答えは、Objective-Cは
Class class = self;
同様に、Swiftは
var klass: AnyClass = self
In Swift 3、self.dynamicType
(およびdynamicType
全般)は削除されました。
次を使用します。
type(of: self)
var klass: AnyClass = object_getClass(self)
NSStringFromClass(klass)