簡體   English   中英

在Swift中對PFObject進行子類化

[英]Subclassing PFObject in 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;

有沒有人想出一個解決Swift缺乏動態合成器的工作,以便用PFSubclassing實現屬性和方法? 我希望能夠做到這樣的事情:

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

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

我有同樣的問題。 不得不將@NSManaged添加到我想保存的屬性中:

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

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

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

希望這在下次更新中得到解決。

解決方案是使用計算屬性而不是存儲屬性:

class Armor : PFObject, PFSubclassing {

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


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

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?

}

注意 :您可以將屬性定義為選項。 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
}

原型是正確的。 截至目前,它不適用於動態屬性,但代碼示例不包含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文檔中缺失。)

我遇到了同樣的問題,但我應該注意你的類定義看起來應該更像這樣:

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通常為您創建的一些便捷方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM