Eri*_*rik 118 introspection swift
我试图class
使用泛型动态创建基于实例的类型,但是我遇到了类内省的困难.
以下是问题:
self.class
?AnyClass
结果实例化一个类NSClassFromString
?AnyClass
从通用参数中获取或以其他方式严格输入信息T
?(类似于C#的typeof(T)
语法)Jia*_*aro 107
那么,对于一个,的雨燕等同[NSString class]
的.self
(见元类型的文档,但他们非常薄).
事实上,NSString.class
甚至没有工作!你必须使用NSString.self
.
let s = NSString.self
var str = s()
str = "asdf"
Run Code Online (Sandbox Code Playgroud)
同样,我试过一个快速的课程......
class MyClass {
}
let MyClassRef = MyClass.self
// ERROR :(
let my_obj = MyClassRef()
Run Code Online (Sandbox Code Playgroud)
嗯......错误说:
Playground执行失败:错误:: 16:1:错误:使用元类型值构造类型为"X"的对象需要'@required'初始值设定项
Run Code Online (Sandbox Code Playgroud)Y().me() ^ <REPL>:3:7: note: selected implicit initializer with type '()' class X { ^
我花了一段时间来弄清楚这意味着什么...原来它希望班级有一个 @required init()
class X {
func me() {
println("asdf")
}
required init () {
}
}
let Y = X.self
// prints "asdf"
Y().me()
Run Code Online (Sandbox Code Playgroud)
一些文档将此称为.Type
,但MyClass.Type
在操场上给我一个错误.
mat*_*att 47
这是如何使用NSClassFromString
.你必须知道你最终会得到的超类.这是一个超类子类对,知道如何描述自己println
:
@objc(Zilk) class Zilk : NSObject {
override var description : String {return "I am a Zilk"}
}
@objc(Zork) class Zork : Zilk {
override var description : String {return "I am a Zork"}
}
Run Code Online (Sandbox Code Playgroud)
请注意使用特殊@obj
语法来指定这些类的Objective-C munged名称; 这是至关重要的,因为否则我们不知道指定每个类的munged字符串.
现在我们可以使用NSClassFromString
Zork类或Zilk类,因为我们知道我们可以将它键入为NSObject而不会在以后崩溃:
let aClass = NSClassFromString("Zork") as NSObject.Type
let anObject = aClass()
println(anObject) // "I am a Zork"
Run Code Online (Sandbox Code Playgroud)
它是可逆的; println(NSStringFromClass(anObject.dynamicType))
也有效.
mon*_*dom 13
如果我正在阅读文档,如果您处理实例,并且例如想要返回与您给定的对象相同类型的新实例,并且可以使用init()构造Type,您可以执行以下操作:
let typeOfObject = aGivenObject.dynamicType
var freshInstance = typeOfObject()
Run Code Online (Sandbox Code Playgroud)
我用String快速测试了它:
let someType = "Fooo".dynamicType
let emptyString = someType()
let threeString = someType("Three")
Run Code Online (Sandbox Code Playgroud)
工作得很好.
J.b*_*nie 13
在快速3
object.dynamicType
Run Code Online (Sandbox Code Playgroud)
已弃用.
而是使用:
type(of:object)
Run Code Online (Sandbox Code Playgroud)
protocol Decoratable{}
class A:Decoratable{}
class B:Decoratable{}
let object:AnyObject = A()
object.dynamicType is A.Type//true
object.dynamicType is B.Type//false
object.dynamicType is Decoratable.Type//true
Run Code Online (Sandbox Code Playgroud)
注意:请注意,它也适用于对象可能扩展或不扩展的协议
归档时间: |
|
查看次数: |
62773 次 |
最近记录: |