Подклассификация PFObject в Swift
Документация Parse для добавления свойств и методов в подклассы PFObject удобно пропускает синтаксис 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;
Кто-нибудь выяснил, что для Swift не хватает динамических синтезаторов для реализации свойств и методов с помощью PFSubclassing? Я хочу иметь возможность сделать что-то вроде:
class Armor : PFObject, PFSubclassing {
class func parseClassName() -> String! {
return "Armor"
}
}
var armor = Armor()
armor.displayName = "Iron Clad"
Ответы
Ответ 1
У меня была такая же проблема. Пришлось добавить @NSManaged к свойствам, которые я хотел сохранить:
class Armor : PFObject, PFSubclassing {
@NSManaged var displayName: String
class func parseClassName() -> String! {
return "Armor"
}
}
var armor = Armor.object()
armor.displayName = "Iron Clad"
Надеюсь, это будет разрешено в следующем обновлении.
Ответ 2
Решение заключается в использовании вычисляемых свойств вместо сохраненных свойств:
class Armor : PFObject, PFSubclassing {
var displayName: String? {
get {
return self["displayName"] as? String
}
set {
self["displayName"] = newValue
}
}
class func parseClassName() -> String {
return "Armor"
}
}
Ответ 3
Swift 1.2
Первый. Создайте быстрый файл и определите подкласс. Не забудьте импортировать Parse! (например, Armor)
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?
}
Примечание. Вы можете определить свои свойства как дополнительные. Каждое значение "undefined" внутри 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
}
Ответ 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.)
Ответ 5
Я столкнулся с той же проблемой, хотя должен заметить, что определение вашего класса должно выглядеть примерно так:
class Armor : PFObject, PFSubclassing {
var displayName: String
class func parseClassName() -> String! {
return "Armor"
}
}
var armor = Armor()
armor.displayName = "Iron Clad"
Я пробовал несколько разных вещей без успеха. Это не похоже на то, что Parse SDK поддерживает это, но имейте в виду, что текущая версия SDK Parse iOS предшествует быстрому объявлению. Похоже, что они работают над лучшей быстрой поддержкой для предстоящего выпуска.
Вместо этого вы все равно можете создавать подклассы PFObject (как и вы) и получать доступ к данным с помощью .getObjectForKey("displayName")
или писать собственные методы класса для доступа к этим данным. Самый большой недостающий кусок - это просто некоторые удобные методы, которые SDK обычно создает для вас.