我以前试过ask this question但是没有明确表达我的问题,所以我会在这里再试一次。我也注意到very similar sounding question,但它要求的是完全不同的东西。
我有以下代码:
class Base {
func launch(code1: Int, code2: Int) { ... }
}
class A: Base {}
class B: Base {}
class C: Base {}
let classes = [A.self, B.self, A.self, B.self, C.self]
for cls in classes {
let obj = ???
}
我想在循环中实例化一个cls
类型的对象并对其做一些事情。我可能在数组中有重复项,如图所示。我应该用什么代替???
来实例化正确的对象?
答案 0 :(得分:6)
您需要的只是required init
,某种方式可以创建一个实例,该实例将在您希望其工作的所有Types
之间共享。保存init方法的protocol
可以正常运行。
显然,当init
不需要参数时,这种方法最简单。
缺点是您需要向下转发结果实例。
protocol ZeroParamaterInit {
init()
}
class Base : ZeroParamaterInit {
func launch(code1: Int, code2: Int) { }
required init() {
}
}
class A: Base {}
class B: Base {}
class C: Base {}
let classes : [ZeroParamaterInit.Type] = [A.self,B.self]
var instances : [Any] = []
for cls in classes {
let instance = cls.init()
instances.append(instance)
}
for instance in instances {
if let test = instance as? A {
print("A")
}
if let test = instance as? B {
print("B")
}
if let test = instance as? C {
print("C")
}
}
答案 1 :(得分:0)
好的,你会喜欢这个链接: http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/
它引导您完成Swift库 Obj ectFactory :
https://github.com/ijoshsmith/swift-factory
你真的不能在Swift中这样做。但是,你可以在Objective-C中完成它,这样你就可以简单地编写一个暴露Swift接口的包装器,在幕后,实际的对象创建在Objective-C中完成。该库正是您正在寻找的。 p>
您需要创建一个像这样的ObjectFactory:
public boolean validateEmail(String email) {
Pattern pattern = Pattern.compile(EMAIL_PATTERN);
Matcher matcher = pattern.matcher(email);
return matcher.matches();
}
然后您可以实例化 MyClass 的实例,如:
let factory = ObjectFactory<MyClass>
答案 2 :(得分:0)
import Foundation
class Base {}
class A: Base { var i: Int = 1 }
class B: Base { var i: String = "bravo" }
class C: Base { var i: Bool = true }
let classes = [A.self, B.self, A.self, B.self, C.self]
for cls in classes {
var obj: Base? {
switch cls {
case is A.Type:
return A()
case is B.Type:
return B()
case is C.Type:
return C()
default:
return nil
}
}
dump(obj)
}
/*
▿ A
▿ Some: A #0
- super: Base
- i: 1
▿ B
▿ Some: B #0
- super: Base
- i: bravo
▿ A
▿ Some: A #0
- super: Base
- i: 1
▿ B
▿ Some: B #0
- super: Base
- i: bravo
▿ C
▿ Some: C #0
- super: Base
- i: true
*/
这与R Menke解决方案非常接近......