首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Swift类自省和泛型

Swift类自省和泛型
EN

Stack Overflow用户
提问于 2014-06-05 08:15:24
回答 7查看 64.2K关注 0票数 125

我正在尝试使用泛型动态创建一个基于class实例的类型,但是我在类自省方面遇到了困难。

以下是问题:

是否有一个与Obj-C的self.class

  • Is等价的Swift?有没有办法使用NSClassFromString

  • Is的AnyClass结果实例化一个类?有没有办法严格地从泛型参数AnyClass中获取T或其他类型信息?(类似于C#的typeof(T)语法)
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2014-06-05 09:26:26

首先,[NSString class]的Swift等价物是.self (参见Metatype docs,尽管它们都很薄)。

事实上,NSString.class甚至不能工作!您必须使用NSString.self

代码语言:javascript
复制
let s = NSString.self
var str = s()
str = "asdf"

类似地,我尝试了一个快速类...

代码语言:javascript
复制
class MyClass {

}

let MyClassRef = MyClass.self

// ERROR :(
let my_obj = MyClassRef()

嗯,…错误信息为:

游乐场执行失败: error::16:1: error::error:构造具有元类型值的类类型'X‘的对象需要'@required’初始值设定项

Y().me() ^ :3:7:注意:选择了类型为'()‘的隐式初始值设定项X{^

我花了一段时间才弄明白这是什么意思,…结果是它想让这个类有一个@required init()

代码语言:javascript
复制
class X {
    func me() {
        println("asdf")
    }

    required init () {

    }
}

let Y = X.self

// prints "asdf"
Y().me()

一些文档将其称为.Type,但MyClass.Type在游乐场上给了我一个错误。

票数 109
EN

Stack Overflow用户

发布于 2014-06-13 10:05:06

下面是如何使用NSClassFromString。你必须知道你最终会得到什么超类。下面是一个超类-子类对,它们知道如何为println描述自身

代码语言:javascript
复制
@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"}
}

注意使用特殊的@obj语法来指定这些类的Objective-C参数名称;这是至关重要的,因为否则我们不知道指定每个类的参数字符串。

现在,我们可以使用NSClassFromString来创建Zork类或Zilk类,因为我们知道可以将其作为NSObject类型,而不会在以后崩溃:

代码语言:javascript
复制
let aClass = NSClassFromString("Zork") as NSObject.Type
let anObject = aClass()
println(anObject) // "I am a Zork"

而且它是可逆的;println(NSStringFromClass(anObject.dynamicType))也可以工作。

现代版本:

代码语言:javascript
复制
    if let aClass = NSClassFromString("Zork") as? NSObject.Type {
        let anObject = aClass.init()
        print(anObject) // "I am a Zork"
        print(NSStringFromClass(type(of:anObject))) // Zork
    }
票数 49
EN

Stack Overflow用户

发布于 2014-06-10 08:47:43

如果我没看错文档,如果你处理实例,例如,想要返回一个与给定对象相同类型的新实例,并且该类型可以用init()构造,你可以这样做:

代码语言:javascript
复制
let typeOfObject = aGivenObject.dynamicType
var freshInstance = typeOfObject()

我用String快速测试了一下:

代码语言:javascript
复制
let someType = "Fooo".dynamicType
let emptyString = someType()
let threeString = someType("Three")

它工作得很好。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24049673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档