在Swift中对PFObject进行子类化

时间:2014-07-05 00:38:00

标签: ios swift parse-platform subclassing

在PFObject子类上添加属性和方法的Parse文档在其示例代码中方便地跳过了Swift语法,列出了Objective-C语法:

https://parse.com/docs/ios_guide#subclasses-properties/iOS

// Armor.h
@interface Armor : PFObject<PFSubclassing>
+ (NSString *)parseClassName;
@property (retain) NSString *displayName;
@end

// Armor.m
@dynamic displayName;

为了使用PFSubclassing实现属性和方法,有没有人想出解决Swift缺乏动态合成器的问题?我希望能够做到这样的事情:

class Armor : PFObject, PFSubclassing {
    class func parseClassName() -> String! {
        return "Armor"
    }
}

var armor = Armor()
armor.displayName = "Iron Clad"

5 个答案:

答案 0 :(得分:22)

我有同样的问题。不得不将@NSManaged添加到我想保存的属性中:

class Armor : PFObject, PFSubclassing {
    @NSManaged var displayName: String

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

var armor = Armor.object()
armor.displayName = "Iron Clad"

希望在下次更新时解决此问题。

答案 1 :(得分:14)

解决方案是使用计算属性而不是存储属性:

class Armor : PFObject, PFSubclassing {

    var displayName: String? {
        get {
            return self["displayName"] as? String
        }
        set {
            self["displayName"] = newValue
        }
    }


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

答案 2 :(得分:6)

Swift 1.2

首先:创建一个swift文件并定义子类。别忘了导入Parse! (例如护甲)

import Foundation
import Parse


class Armor: PFObject, PFSubclassing {

    // MARK: - PFSubclassing

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

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


    // MARK: - Parse Core Properties

    @NSManaged var displayName: String?

}

注意:您可以将属性定义为选项。每一个&#34; undefined&#34; Parse Core Manager中的值将被转换为&#34; nil&#34;。

第二次:在 AppDelegate.swift 中注册所有子类。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    // MARK: - Parse Setup
    Parse.setApplicationId("YOUR_ID", clientKey: "YOUR_KEY")

    // MARK: - Parse Register Subclasses
    Armor.registerSubclass()

    return true
}

答案 3 :(得分:4)

原型是正确的。截至目前,它不适用于动态属性,但代码示例不包含registerSubclass Parse建议,因此代码应包含如下:

class Armor : PFObject, PFSubclassing {
    @NSManaged var displayName: String

    override class func load() {
        self.registerSubclass()
    }
    class func parseClassName() -> String! {
        return "Armor"
    }
}

var armor = Armor.object()
armor.displayName = "Iron Clad"

(请注意,“覆盖”是必需的,但在Parse文档中缺失。)

答案 4 :(得分:1)

我遇到了同样的问题,但我应该注意你的类定义应该更像这样:

class Armor : PFObject, PFSubclassing {
    var displayName: String

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

var armor = Armor()
armor.displayName = "Iron Clad"

我尝试了一些不同的事情而没有成功。它看起来不像Parse SDK支持这一点,请记住,Parse iOS SDK的当前版本早于swift公告。听起来他们正在努力为即将发布的版本提供更好的快速支持。

相反,您仍然可以创建PFObject子类(就像您一样)并使用.getObjectForKey("displayName")访问数据,或者编写自己的类方法来访问此数据。最缺少的部分实际上只是SDK通常为您创建的一些便捷方法。