我正在尝试编写一个通用类,该类采用自定义类名并创建该类名的实例。在创建之前和之后,我都会做一些适用于所有类的常规工作。我想向实例添加一些特定于类的参数。这就是为什么我添加了一个闭包,该闭包在创建实例后以实例对象本身作为闭包的参数被调用。闭包是可选的。有趣的是,在不使用闭包的情况下调用该函数的效果很好,如果添加闭包,则会出现以下编译器错误:
类型名称后的预期成员名称或构造函数调用
此编译器错误适用于第一个参数,这没有任何意义,因为仅使用第一个参数调用该函数就可以正常工作...
我添加了用于Playground的简单示例:
class Base {
var test1: Int = 0
}
class A: Base {
var test2: Int = 0
}
class B: Base {
var test3: Int = 0
}
func create<T: Base>(aClass: T.Type, addParameter:((T) -> Void)? = nil) {
println("Do generic stuff before object is created")
var object = aClass()
// Add custom class specific parameters to object
if let l_addParameter = addParameter {
l_addParameter(object)
}
println("Do generic stuff after object was created")
}
create(A)
create(B)
create(B, addParameter: { (b: B) -> Void in
b.test3 = 1000
})
任何帮助将非常感激!谢谢!
传递一个正确的方法Type
是ClassName.self
,如
create(A.self)
create(B.self, addParameter: { (b: B) -> Void in
b.test3 = 1000
})
(而且我无法告诉您,.self
如果在没有附加参数的情况下调用该函数,为什么省略该方法)。
进行了此更正后,您的代码可以正确编译,但无法正常工作。如Swift Generic Factory中所述:错误?,您必须init
在基类中添加必需的方法,
class Base {
required init() { } // ***
var test1: Int = 0
}
否则
var object = aClass()
将始终创建基类的对象,而不是实际类型的对象(作为参数传递的对象)(因此b.test3 = 1000
在闭包中将异常终止)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句