Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 基于在Swift中作为参数传递的类实现动态初始化_Ios_Swift - Fatal编程技术网

Ios 基于在Swift中作为参数传递的类实现动态初始化

Ios 基于在Swift中作为参数传递的类实现动态初始化,ios,swift,Ios,Swift,我想根据传递给函数的类创建对象 首先,我有一个接口,每个可生成的对象都应该符合: interface Generatable{ init(raw: NSDictionary) } 以及一个将类作为参数的函数 func generateDynamicObjectFromClass(generatable: Generatable.Type){ var someJSONData : NSDictionary = NSDictionary() var myGenerat

我想根据传递给函数的类创建对象

首先,我有一个接口,每个可生成的对象都应该符合:

interface Generatable{

    init(raw: NSDictionary)

}
以及一个将类作为参数的函数

func generateDynamicObjectFromClass(generatable: Generatable.Type){

    var someJSONData : NSDictionary = NSDictionary()
    var myGeneratedObject : Generatable = generatable(raw: someJSONData) //custom initialiser of Generatable class

}
然后,这样称呼它:

generateDynamicObjectFromClass(MyGeneratableObject.Type)
MyGenerateableObject类
但是,MyGenerateableObject没有Type属性,因此问题是在运行时获取基础对象的相应类。可能吗

必须将
GeneratedDynamicObjectFromClass
定义为通用函数:

protocol Generatable {
    init(raw: NSDictionary)
}

func generateDynamicObjectFromClass<T where T:Generatable>(generatable:T.Type, otherParam: NSString = "") -> T {
    var someJSONData : NSDictionary = NSDictionary()
    var myGeneratedObject = T(raw: someJSONData)
    return myGeneratedObject
}

class MyGeneratableObject : NSObject, Generatable {

    init(raw: NSDictionary){
        println("MyGeneratableObject init")
    }
}

var myObject1  = generateDynamicObjectFromClass(MyGeneratableObject.self, otherParam: "foo")
var myObject2  = generateDynamicObjectFromClass(MyGeneratableObject.self)

不需要单独的功能。

答案很好,我在操场上测试了它,效果很好。我将如何使用多个参数执行此操作?对不起,我不太熟悉通用函数。。。假设我将函数更改为
func-generatedDynamicObjectFromClass(otherParam:NSString,generatable:T.Type)->T
(不起作用),我将如何编写它?@评论家:请参阅更新的答案。实际上,
MyGeneratableObject.self
是引用类型的正确方法(据我所知)。我不知道为什么第一个版本可以工作。好吧,太棒了,还有最后一件事:我如何使这个参数成为可选的?我试图在T之后添加一个问号。输入参数,但它不允许我通过nil。有什么想法吗?@评论家:我再次更新了答案。这里记录了可选参数:。好的,但我的意思是
可生成的
参数应该为零,而不是
其他参数
protocol Generatable {
    init(raw: NSDictionary)
}

func generateDynamicObjectFromClass<T where T:Generatable>(generatable:T.Type, otherParam: NSString = "") -> T {
    var someJSONData : NSDictionary = NSDictionary()
    var myGeneratedObject = T(raw: someJSONData)
    return myGeneratedObject
}

class MyGeneratableObject : NSObject, Generatable {

    init(raw: NSDictionary){
        println("MyGeneratableObject init")
    }
}

var myObject1  = generateDynamicObjectFromClass(MyGeneratableObject.self, otherParam: "foo")
var myObject2  = generateDynamicObjectFromClass(MyGeneratableObject.self)
var myObject = MyGeneratableObject(raw: NSDictionary())