web-dev-qa-db-ja.com

swift:同等のObjective-Cランタイムクラス

同等のものは何ですか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)

注:見つかった この投稿 しかし、助けにはならなかった。

33
Mani

まず、Objective-Cでそのクラスオブジェクトを何に使用したのかを知らずに、そのコードをSwiftに変換するのは困難です。

Objective-Cでは、クラスオブジェクトはオブジェクトであり、タイプClassは任意のクラスオブジェクトへのポインターを保持できます。ただし、Objective-C APIがSwiftにブリッジされると、Class型はSwiftでAnyClass!に変換されます。ここで、AnyClassAnyObject.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()は機能しているはずです。機能しない唯一の説明は、selfnotオブジェクトである場合です。あなたのエラーメッセージは、確かに、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
49
newacct

In Swift 3、self.dynamicType(およびdynamicType全般)は削除されました。

次を使用します。

type(of: self)
7
Dafydd Williams
var klass: AnyClass = object_getClass(self)
NSStringFromClass(klass)
5
mientus