解析 - 用Swift进行子类化?

3

我正在尝试用Swift实现标准子类化。

Bridging-Header.h

#import <Parse/Parse.h>
#import <Parse/PFObject+Subclass.h>
#import <Parse/PFGeoPoint.h>

子类

class Event: PFObject, PFSubclassing {

    class func parseClassName() -> String! {
        return "Event"
    }

    override class func load() {
        registerSubclass()
    }
}

我收到一个编译错误,提示Event不符合PFSubclassing。

有什么建议吗?


这应该可以与最新的SDK版本1.2.20一起使用。在您所拥有的版本中,PFObject.h文件中的objectWithoutDataWithClassName方法的返回类型需要从id更改为instancetype。 - Fosco
@Fosco 我正在使用CocoaPods,目前最新版本是1.2.19。你知道最新版本何时会被提交吗? - aryaxt
3个回答

2

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

在Swift中,您需要覆盖initialize函数。

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

我发现自动注册并不总是有效,因此我在我的AppDelegate中明确地注册了子类。请确保在使用setApplicationId:clientKey:初始化Parse之前进行注册。

Event.registerSubclass()

@c0d3Junk13 请注意,初始化方法直到类接收到第一条消息才会被调用,这意味着您需要在子类上调用任何实例或类方法,然后它才能在Parse SDK中注册。 - dhallman

1

查看此线程。以下是该问题的解释:

我已经向Parse报告了这个问题。基本上问题出在Parse头文件中,其中PFSubclassing.h中的协议定义以如下方式定义此方法:+ (instancetype)objectWithoutDataWithObjectId:(NSString )objectId; 但是然后PFObject+Subclass.h通过以下方式实现相同的方法(请注意区别:instancetype --> id)+ (id)objectWithoutDataWithObjectId:(NSString )objectId; 这足以让Swift抱怨。我找到的唯一解决方案是直接更改框架定义中的标头,将“id”替换为“instancetype”。如果您这样做,则代码将编译。

所以,以下是您的解决方案,它对我有用; 我有同样的问题:

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

你需要在Objective-C桥接头文件中导入PFObject+Subclass.h,感谢这位大佬 -> https://dev59.com/nYLba4cB1Zd3GeqPdVy5#25248838 - sachadso
是的,即使我包含了桥接头并更改了方法签名,这仍然没有起作用。有任何更新吗? - C0D3

-1

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

  • 不需要显示类符合协议 PFSubclassing,以下内容已足够

class Event : PFObject { // 代码 }

  • 如果使用 pods,则无需在任何地方包含 Parse、PFSubclassing

示例可以如下所示:

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对象映射到Parse的最佳方式。我从UML类图构建了我的结构,并在该图中添加了设置在Parse数据库中的关系。虽然不是最佳实践,但它给了我需要的东西。

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


当然不会......应用程序终止,因为未捕获的异常'NSInternalInconsistencyException',原因是“只能在符合PFSubclassing协议的子类上调用+registerSubclass。” - C0D3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接