在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"
答案 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通常为您创建的一些便捷方法。