【问题标题】:Could not init a PFObject subclass无法初始化 PFObject 子类
【发布时间】:2015-04-11 19:29:57
【问题描述】:

升级到 Xcode 6.3 6D570(和 Swift 1.2)后,子类对象的 init 无法编译。 假设我有一个名为 Armor 的类,它继承自 PFObject、PFSubclassing(正如 Parse 文档所说)。

当我尝试创建实例时,例如var armor = Armor(),我收到以下编译错误:

调用中的参数“className”缺少参数

然后我在 Parse 文档中读到我应该使用“对象”类方法来初始化一个子类对象。所以我尝试这样初始化:var armor = Armor.object().

然后我得到以下编译错误:

'object()' 不可用:使用对象构造'PFObject()'

我正在使用 Parse SDK 版本 1.7.1。

我也重写parseClassName方法如下:

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

在设置 Parse 之前,我在初始化方法和应用委托上注册了子类:

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

我应该如何正确地初始化一个子类对象?

【问题讨论】:

  • 您似乎忘记包含编译错误。究竟是什么失败了?
  • 我的错,添加编译错误,谢谢。
  • 您是否已将 Parse SDK 更新到 1.7.1 版?
  • 你重写了子类中的parseClassName方法吗?如果是的话,你能展示一下吗?
  • 是的,是的(见编辑)

标签: ios swift parse-platform


【解决方案1】:

================================================ ============================

此问题已在 1.7.3 PARSE SDK 中修复 您可以在此处下载新版本: https://parse.com/docs/downloads

================================================ ============================

虽然文档对此并不清楚,但不再需要在 Swift 中使用 .object()。 正如here 所说,在 Swift 代码 sn-p 中找到 here

现在,这很奇怪,但要使Armor() 工作,您需要在同一个文件中以某种方式引用PFUser 类。也许它不必是PFUser,但我还没有深入研究它。

所以,这行不通

import UIKit
import Parse
import Bolts

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        Parse.setApplicationId("appID", clientKey: "clientKey")

        let myArmor = Armor()

        return true
    }
}

但这会

import UIKit
import Parse
import Bolts

private let fix = PFUser.hash() // here's the weird trick

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        Parse.setApplicationId("appID", clientKey: "clientKey")

        let myArmor = Armor()

        return true
    }
}

希望这会有所帮助,Parse 会尽快推出修复程序。

还有reported as a bug

【讨论】:

    【解决方案2】:

    将该类注册为AppDelegate 中的子类,但在调用Parse.initialize 之前。 然后你可以deleteoverwritten function initialize

    这将使:

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]!) -> Bool {
    
            Armor.registerSubclass()
    
            // Further initialization
    
            return true
        }
    

    然后通过调用构造函数来初始化类:

    var myArmor = Armor()
    

    【讨论】:

    • 感谢您的回答。我试过了,但没有用。我提醒我在构建应用程序之前会遇到编译错误,因此它不应该受到不直接相关的方法更改的影响。
    • @Alonzo 你试过删除派生数据吗?并清理项目?
    • 是的,是的。顺便说一句,当我使用编译器建议的构造函数时:var myArmor = Armor(className: "Armor") ,它运行良好(但它不是一个干净的解决方案)
    • 是的,我什至尝试覆盖 init(),但也没有用
    猜你喜欢
    • 1970-01-01
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 2021-03-30
    • 2021-11-03
    • 2012-08-01
    • 2012-10-10
    相关资源
    最近更新 更多