2015-05-13 41 views
2

我正在尝试编写一个泛型类,它需要一个自定义类名称并创建该类名称的一个实例。 创建之前和之后我会做一些适用于所有类的通用东西。 我想添加一些参数到类特定的实例。这就是为什么我添加了一个闭包,该闭包在实例创建之后被实例对象本身作为闭包的参数调用。关闭是可选的。 有趣的是调用函数不关闭工作得很好,如果我添加了关闭,我得到以下编译器错误:Swift/iOS SDK:具有类类型/名称封闭/块的泛型函数问题

Expected member name or constructor call after type name

此编译器错误适用于第一个参数,这是没有意义的,因为只是调用函数与第一个参数正常工作......

我已经加入我的简单例子运动场:

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 
}) 

任何帮助,将不胜感激!谢谢!

回答

2

通过Type的正确方法是ClassName.self,例如,

create(A.self) 
create(B.self, addParameter: { (b: B) -> Void in 
    b.test3 = 1000 
}) 

(我不能告诉你为什么忽略.self作品如果函数 被称为没有额外的参数)。

通过此更正,您的代码编译没有错误,但是 不起作用。作为Swift Generic Factory: Bug?注意到, 你有一个需要init方法添加到您的基类,

class Base { 
    required init() { } // *** 
    var test1: Int = 0 
} 

否则

var object = aClass() 

总会创建基类的对象,而不是实际的 类型什么是作为参数传递的(因此封闭中的b.test3 = 1000 将异常中止)。

+0

非常感谢!完美的作品! – Django

相关问题