Swiftはリフレクションをサポートしていますか?例えばのようなものがあるvalueForKeyPath:
とsetValue:forKeyPath:
スウィフトのオブジェクトのためには?
実際にはobj.class
、Objective-Cのような動的な型システムもありますか?
Swiftはリフレクションをサポートしていますか?例えばのようなものがあるvalueForKeyPath:
とsetValue:forKeyPath:
スウィフトのオブジェクトのためには?
実際にはobj.class
、Objective-Cのような動的な型システムもありますか?
回答:
いくつかのリフレクションのサポートが始まったようです:
class Fruit {
var name="Apple"
}
reflect(Fruit()).count // 1
reflect(Fruit())[0].0 // "name"
reflect(Fruit())[0].1.summary // "Apple"
mchambers gistから、ここ:https ://gist.github.com/mchambers/fb9da554898dae3e54f2
Mirror
実際に単語をIDE
数回引用します。
_stdlib_getTypeName
役立つかを確認してください。
クラスがを拡張する場合、NSObject
Objective-Cの内省とダイナミズムはすべて機能します。これも:
この機能の1つの欠点は、Swiftのオプションの値タイプがサポートされていることです。たとえば、Intプロパティは列挙および変更できますが、Int?プロパティはできません。オプションの型は、reflect / MirrorTypeを使用して部分的に列挙できますが、変更はできません。
クラスが拡張しない場合、NSObject
新しい非常に限定された(そして進行中の)リフレクションのみが機能し(reflect / MirrorTypeを参照)、クラスとプロパティについてインスタンスに質問する機能が制限されますが、上記の追加機能はありません。
NSObjectを拡張しない場合、または '@objc'ディレクティブを使用する場合、Swiftはデフォルトで静的およびvtableベースのディスパッチを行います。これはより高速ですが、仮想マシンがない場合、ランタイムメソッドのインターセプトは許可されません。このインターセプトはCocoaの基本的な部分であり、次のタイプの機能に必要です。
したがって、Swiftを使用して実装されたCocoa / CocoaTouchアプリケーションに留めることをお勧めします。
概要:
参照データ:メソッド呼び出しの実行オーバーヘッド:
(実際のパフォーマンスはハードウェアに依存しますが、比率は同じままです)。
また、dynamic属性を使用すると、メソッドで動的ディスパッチを使用するようにSwiftに明示的に指示できるため、インターセプトがサポートされます。
public dynamic func foobar() -> AnyObject {
}
ドキュメントは動的型システムについて、主に
Type
そして dynamicType
メタタイプタイプ(言語リファレンス)を参照してください。
例:
var clazz = TestObject.self
var instance: TestObject = clazz()
var type = instance.dynamicType
println("Type: \(type)") //Unfortunately this prints only "Type: Metatype"
今TestObject
拡張すると仮定しますNSObject
var clazz: NSObject.Type = TestObject.self
var instance : NSObject = clazz()
if let testObject = instance as? TestObject {
println("yes!") //prints "yes!"
}
現在、リフレクションは実装されていません。
編集:私は明らかに間違っていました、stevexの答えを見てください。プロパティの組み込みには、おそらくIDEがオブジェクトの内容を検査できるようにするために、いくつかの単純な読み取り専用リフレクションがあります。
現時点では、SwiftリフレクションAPIはAppleにとって高い優先度ではないようです。しかし、@ stevexの回答の他に、標準ライブラリに役立つ別の関数があります。
ベータ6以降_stdlib_getTypeName
、変数のマングル型名が取得されます。これを空の遊び場に貼り付けます。
import Foundation
class PureSwiftClass {
}
var myvar0 = NSString() // Objective-C class
var myvar1 = PureSwiftClass()
var myvar2 = 42
var myvar3 = "Hans"
println( "TypeName0 = \(_stdlib_getTypeName(myvar0))")
println( "TypeName1 = \(_stdlib_getTypeName(myvar1))")
println( "TypeName2 = \(_stdlib_getTypeName(myvar2))")
println( "TypeName3 = \(_stdlib_getTypeName(myvar3))")
出力は次のとおりです。
TypeName0 = NSString
TypeName1 = _TtC13__lldb_expr_014PureSwiftClass
TypeName2 = _TtSi
TypeName3 = _TtSS
Ewan Swickのブログエントリは、これらの文字列を解読するのに役立ちます。
たとえば_TtSi
、Swiftの内部Int
タイプを表します。