作者:好吃懒做的杰克6
原文:新浪微博博客5

最近项目全面从 ObjectiveC 升级到 Swift,难免得将 LeanCloud 的对象的子类们也得升级。

确实,OC 可以暂时性直接解决问题。可是出去对未来的考虑(程序员的强迫症[威武][威武][威武]),经过反复摸索,总结,终于还是能够实现在 Swift 语言中直接做到对对象的子类化。仅以此文分享经验。

Note:此文 Assume 你对 LeanCloud 的基本使用以及和 Swift 语言基本语法有所了解。第一次发教程,可能不是很清晰 or 准确,但是绝对亲测可用。欢迎指导意见。

废话不多说,直接进入正题。
OC 如何子类话就不重复了,就用文档16里的 Student ,下面是如何用swift写出这个子类。

//==============================================================
//  Student is a subclass of AVObject
//  Class name: Student
//  Author: Xujie Song
//  Copyright (c) 2015 SK8 PTY LTD. All rights reserved.
//==============================================================

import Foundation
class Student : AVObject, AVSubclassing {

// ============================================================
// Constructors
// ===========================================================

//必须要有这个Method,无论什么Class
class func parseClassName() -> String? {
    return "Student"
}

//这个必须有,private or not无所谓
private override init() {
    super.init();
}

//若需要自定义Constructor(or Initializer)
init(studentName: String) {
    super.init();
    self.name = studentName;
}

// ============================================================
// Instance Property
// ============================================================

//例如,Student这个子类里有一个Property,“name“
//在OC里的@Dynamic,Swift里应该用@NSManaged
//请确保 Key Name 和 @NSManaged var 一致,并且不要漏掉 @NSManaged
@NSManaged var name: String?
//也请确保,其他想要加入的property,不要和Key Name 重叠,比如
//var name: String?    这样会程序会崩溃

// ============================================================
// Property setters and getters
// ============================================================

//Property setter and getter 在Swift中不是必须的,出于和Java的同步性(程序员的强迫症[威武][威武][威武])
func getName() -> String? {
    //return self["name"]; 或
    return self.objectForKey("name") as? String;
}

func setName(name: String) {
    //self["name"] = name; 或
    self.setObject(name, forKey: "name");
}

// =======================================================
// Class Method
//=========================================================

class  func isSingle() -> Bool {
    return false;
}

// ============================================================
// Instance Method
// ============================================================
func isInARelationship() -> Bool {
    return true;
}

}

写完这个子类后,确保在 AppDelegate.swift 中,AVOSCloud.setApplicationId 前,加入

Student.registerSubclass();

这样一来,Student 应该就可以正常使用了。

转载请注明出处!
关注我的微博 @好吃懒做的杰克,@SK8科技。

4 人赞了这个帖子.

请问如何初始化swift写的子类呢?
我看官方文档里面有这样一句话:“创建一个子类实例,要使用 object 类方法。要创建并关联到已有的对象,请使用 objectWithoutDataWithObjectId: 类方法。” 请问这句话转成swift语言应该怎么写?

@Easy_Studio

import UIKit
class Todo: AVObject, AVSubclassing {
    
    static func parseClassName() -> String? {
        return "Todo"
    }
    
    @NSManaged var content: String?
}

//更新
let todo = Todo(withoutDataWithObjectId: "XXXXXXX")
todo.content = "哈哈"
todo.saveInBackground()

//新建
let todo = Todo()
todo.content = "哈哈2"
todo.saveInBackground()

2 人赞了这个帖子.