gpt4 book ai didi

objective-c - 从 Reference 而不是 String 实例化类

转载 作者:行者123 更新时间:2023-11-28 09:19:21 26 4
gpt4 key购买 nike

假设我有一个类

class Test {

}

然后在程序的另一部分我可以做

   let testClass = NSClassFromString( "Test" ) as NSObject.Type
let testInstance = testClass()

有没有办法从 Test 本身的引用做同样的事情,将 Test 作为引用传递,然后从引用创建一个对象

通过引用,我的意思是通过测试本身,并且接收部分代码将能够从中创建对象。

就像我们以前在 Objective-C 中做的那样

TestClassRef = [Test class]

[[TestClassRef alloc] init]

编辑:

protocol ISomeProtocol {
func action ()
func init()
}

class Test
var classesMap = Dictionary<String,ISomeProtocol>()

func init () {
self.classesMap = Dictionary<String,ISomeProtocol>()
}

func myAction (name:String ) {
var myClass:ISomeProtocol;

if let myClass = self.classesMap[ name ] {
var myInstance = myClass() as ISomeProtocol
myInstance.action()
} else {
return
}

}
}

最佳答案

是的,但是你需要对类(class)做出一些 promise 。例如,您的 objC 代码的等价物是这样的:

let testClass: AnyClass = Test.self
let test = testClass()

那不会编译,因为 Swift 无法知道 AnyClass 有一个可用的 init()。您需要保证它可以被简单地构建:

protocol Trivial {
init()
}

这意味着你的类必须符合:

final class Test: Trivial {
required init() {}
}

然后你就可以自由地传递和使用类的引用了:

func make<T: Trivial>(type: T.Type) -> T {
return type()
}

let myType = Test.self

let something = make(myType)

(我将它包装到一个名为 make 的函数中,因为一些没有函数的更简单的示例目前会导致编译器崩溃。但大多数时候你还是想将它传递给一个函数。)

来自其他方向的关于此问题的更多讨论:

关于objective-c - 从 Reference 而不是 String 实例化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26080339/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com