Swift类内省和泛型

Eri*_*rik 118 introspection swift

我试图class使用泛型动态创建基于实例的类型,但是我遇到了类内省的困难.

以下是问题:

  • 是否有一个与Obj-C相当的Swift 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'初始值设定项

 Y().me()
 ^
 <REPL>:3:7: note: selected implicit initializer with type '()'
 class X {
       ^
Run Code Online (Sandbox Code Playgroud)

我花了一段时间来弄清楚这意味着什么...原来它希望班级有一个 @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在操场上给我一个错误.

  • 你可以在变量声明中使用`.Type`或`.Protocol`,例如`let myObject:MyObject.Type = MyObject.self` (14认同)
  • `@`在'required`之​​前应删除 (2认同)

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字符串.

现在我们可以使用NSClassFromStringZork类或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))也有效.

  • 赞成`@objc(ClassName)`位.我知道`@objc`属性但不是你也可以给出关于类名的提示. (10认同)

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)


eon*_*ist 7

Swift实现比较类型

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)

注意:请注意,它也适用于对象可能扩展或不扩展的协议