使用Swift解析子类?

使用Swift解析子类?,swift,parse-platform,Swift,Parse Platform,我正试图获得一个标准的子类来与swift一起工作 桥接头.h #import <Parse/Parse.h> #import <Parse/PFObject+Subclass.h> #import <Parse/PFGeoPoint.h> 获取一个编译错误,表示事件不符合子类化 有什么建议吗?请查看。以下是问题的解释: 我已经打开了一个bug来解析这一点。基本上,问题在于解析头文件,其中PFSubclassing.h中的协议定义以以下方式定义此方法:+(in

我正试图获得一个标准的子类来与swift一起工作

桥接头.h

#import <Parse/Parse.h>
#import <Parse/PFObject+Subclass.h>
#import <Parse/PFGeoPoint.h>
获取一个编译错误,表示事件不符合子类化

有什么建议吗?

请查看。以下是问题的解释:

我已经打开了一个bug来解析这一点。基本上,问题在于解析头文件,其中PFSubclassing.h中的协议定义以以下方式定义此方法:+(instancetype)ObjectWithDataWithObjectId:(NSString)objectId;但是PFObject+Subclass.h以这种方式实现了相同的方法(注意区别:instancetype-->id)+(id)ObjectWithDataWithObjectId:(NSString)objectId;这足以让斯威夫特抱怨。我发现的唯一解决方案是通过将“id”替换为“instancetype”直接更改框架定义中的标题。如果这样做,代码将编译

所以,这是你的解决方案,它对我有效;我也有同样的问题:

  • 打开PFSubclassing.h(请注意,这是解析目录下的PFSubclassing.h)
  • 查找
    objectWithoutDataWithObjectId:
    方法
  • 将方法签名替换为:
    (id)objectWithoutDataWithObjectId:(NSString*)objectId

查看我的解析子类生成器。它可以为您生成Swift和Objective-C类

在Swift中,您需要重写初始化函数

override class func initialize() {
    struct Static {
        static var onceToken : dispatch_once_t = 0;
    }
    dispatch_once(&Static.onceToken) {
        self.registerSubclass()
    }
}
我发现这种自动注册并不总是有效的,所以我也在AppDelegate中显式注册子类。使用
setApplicationId:clientKey:

Event.registerSubclass()

对于Parse 1.9.1和Swift 2.1的最新版本,则以下内容适用:

  • 无需证明该类符合协议PFSubclassing,以下内容就足够了
类事件:PFObject{//code}

  • 如果您使用pod,那么您不需要在任何地方都包含Parse、pf和子类
示例如下所示:

class Event: PFObject {

// @NSManaged gives you autosuggest and type check
@NSManaged var var1: String? 
@NSManaged var var2: String?

override class func initialize() {
    struct Static {
        static var onceToken : dispatch_once_t = 0;
    }
    dispatch_once(&Static.onceToken) {
        self.registerSubclass()
    }
  }
}
我会试试你的类生成器,感觉我可以在那里节省很多时间。一直在研究映射Swift对象以进行解析的最佳方法。我从UML类图构建了我的结构,并将Parse DB中设置的关系添加到图中。虽然它给了我我所需要的,但不是最佳实践


将使用您的生成器,并将其设计为4层,第4层为Parse DB,第3-1层为MVC,使用您的代码和UML类图中所需的逻辑生成M。

这应该适用于最新的SDK版本1.2.20。在您拥有的版本中,PFObject.h中objectWithoutDataWithClassName的返回类型需要从id更改为instancetype。@Fosco我使用的是cocoapods,可用的最新版本是1.2.19。你知道最新版本什么时候会在那里提交吗?你需要在你的Objective-C桥接头中导入PFObject+Subclass.h,这个家伙的道具->是的,即使我包含了桥接头并更改了方法签名,这仍然不起作用。有更新吗?当然没有。。。。。由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因是:“只能对符合pfSubClass的子类调用+registerSubclass”。@c0d3Junk13请注意,在类收到第一条消息之前不会调用initialize方法,这意味着您需要调用子类上的任何实例或类方法,然后才能将其注册到Parse SDK。
class Event: PFObject {

// @NSManaged gives you autosuggest and type check
@NSManaged var var1: String? 
@NSManaged var var2: String?

override class func initialize() {
    struct Static {
        static var onceToken : dispatch_once_t = 0;
    }
    dispatch_once(&Static.onceToken) {
        self.registerSubclass()
    }
  }
}