在Swift中对PFObject进行子类化

use*_*775 16 subclassing ios parse-platform swift

用于在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;
Run Code Online (Sandbox Code Playgroud)

有没有人想出一个解决Swift缺乏动态合成器的工作,以便用PFSubclassing实现属性和方法?我希望能够做到这样的事情:

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

var armor = Armor()
armor.displayName = "Iron Clad"
Run Code Online (Sandbox Code Playgroud)

小智 22

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

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

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

var armor = Armor.object()
armor.displayName = "Iron Clad"
Run Code Online (Sandbox Code Playgroud)

希望这在下次更新中得到解决.


And*_*oth 15

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

class Armor : PFObject, PFSubclassing {

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


    class func parseClassName() -> String {
        return "Armor"
    }
}
Run Code Online (Sandbox Code Playgroud)

  • OP需要接受这个作为答案,因为它对我也有用.多亏了这个答案,我没有浪费几个小时来搞清楚这一点.Parse还需要更新他们的文档,而不是依靠SO来记录他们在swift中做事的方法. (2认同)

use*_*170 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?

}
Run Code Online (Sandbox Code Playgroud)

注意:您可以将属性定义为选项.Parse Core Manager中的每个"未定义"值都将转换为"nil".

第二:在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
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*ick 1

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

class Armor : PFObject, PFSubclassing {
    var displayName: String

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

var armor = Armor()
armor.displayName = "Iron Clad"
Run Code Online (Sandbox Code Playgroud)

我尝试了一些不同的事情但没有成功。看起来 Parse SDK 尚不支持此功能,请记住,Parse iOS SDK 的当前版本早于 swift 发布的版本。听起来他们正在努力为即将发布的版本提供更好、更迅速的支持。

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