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