Answers:
看起来有些反射支持已经开始:
class Fruit {
var name="Apple"
}
reflect(Fruit()).count // 1
reflect(Fruit())[0].0 // "name"
reflect(Fruit())[0].1.summary // "Apple"
从mchambers要点,在这里:https ://gist.github.com/mchambers/fb9da554898dae3e54f2
Mirror
实际上IDE
多次引用该词。
_stdlib_getTypeName
帮助。
如果一个类扩展了NSObject
,那么Objective-C的所有内省和活力都会起作用。这包括:
此功能的一个缺点是对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!"
}
当前,没有实现反射。
编辑:我显然是错的,请参阅史蒂夫的答案。对于内置的属性有一些简单的只读反射,可能允许IDE检查对象内容。
目前,对于苹果而言,Swift反射API似乎并不是一个高优先级。但是,除了@stevex 答案之外,标准库中还有另一个函数可以提供帮助。
从beta 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
类型。