Подклассификация 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 обычно создает для вас.