Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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
如何在Swift中使用方便的初始值设定项调用类方法_Swift_Initialization - Fatal编程技术网

如何在Swift中使用方便的初始值设定项调用类方法

如何在Swift中使用方便的初始值设定项调用类方法,swift,initialization,Swift,Initialization,我试图使用一个API,其中每个对象对其ID字段的命名都不同。示例:Group.groupid、Team.teamid等 我有一个BaseAPIObject,它有一个接受解析JSON字典的必需初始值设定项和一个只接受ID字段(我的类唯一必需的属性)的方便初始值设定项 我已经通过添加一个静态的aka“class”方法来处理id字段名的变化,该方法返回id字段名,子类重写该函数以返回它们自己的字段名 我的问题是,在基类的便利初始化器中,在调用self.init()之前,我无法调用self.dynami

我试图使用一个API,其中每个对象对其ID字段的命名都不同。示例:Group.groupid、Team.teamid等

我有一个
BaseAPIObject
,它有一个接受解析JSON字典的必需初始值设定项和一个只接受ID字段(我的类唯一必需的属性)的方便初始值设定项

我已经通过添加一个静态的aka“class”方法来处理id字段名的变化,该方法返回id字段名,子类重写该函数以返回它们自己的字段名

我的问题是,在基类的便利初始化器中,在调用self.init()之前,我无法调用self.dynamicType,但在正确构造对象之前,我需要该静态类函数的结果

public class BaseAPIObject {
    var apiID: String!
    var name: String?
    var createdBy: String?
    var updatedBy: String?

    //Construct from JSONSerialization Dictionary
    required public init(_ data: [String: AnyObject]) {
        name        = data["name"] as String?
        createdBy   = data["created_by"] as String?
        updatedBy   = data["updated_by"] as String?

        super.init()

        let idName = self.dynamicType.idFieldName()
        apiID = data[idName] as String?
    }

    /// Creates an empty shell object with only the apiID set. 
    /// Useful for when you have to chase down a nested object structure
    public convenience init(id: String) {
        // THIS is what breaks! I can't call self.dynamicType here
        // How else can I call the STATIC CLASS method?
        // in ObjC this would be as simple as self.class.getIdFieldName()
        let idFieldName = self.dynamicType.getIdFieldName()
        let data = [idFieldName: id]
        self.init(data)
    }

    //This gets overridden by subclasses to return "groupid" or whatever
    class func idFieldName() -> String {
        return "id"
    }
}

问题:在实例本身上运行init之前,如何解决调用子类的class函数的问题?

创建init函数,而不是创建用于计算id的class函数。因为您已经必须为每个子类创建其中一个函数,所以实际上并没有丢失任何东西。然后,子类init函数使用id名称调用super的init

这里有一个例子,我更改了您组的一些属性,只是为了使示例更简单,以说明概念

public class BaseAPIObject {
    var objData: [String:String]

    required public init(_ data: [String: String]) {
        println("Data: \(data)")
        self.objData = data

    }

    public convenience init(id: String, idFieldName: String) {
        let data = [idFieldName: id]
        self.init(data)
    }
}
然后在你的子类中,概念上是这样的:

public class GroupObject: BaseAPIObject {
    public convenience init (id: String) {
        self.init(id: id, idFieldName: "group")
    }
}

let go = GroupObject(id: "foo")
println(go.objData["group"]!) //prints "foo"

这就是我昨晚为了解决这个问题而做的事情,但我仍然必须保留class函数,因为我在init中也使用了它,这是我无法用同样的技术解决的。如果没有人能想出办法,我会接受这个答案。