如何在Swift中返回Realm列表?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Swift中返回Realm列表?相关的知识,希望对你有一定的参考价值。

我有2个领域列表

我正在尝试使用healper功能,所以我可以在它们之间进行选择,在UITableview上显示其中一个

我的模型看起来像这样

public class RealmModel : Object {

    public var arrayList1 = List<realmList1>()
    public var arrayList2 = List<realmList2>()


    func ChooseList<T> (cehck : Bool) ->  List<T> {

        if cehck == true {
            return arrayList1 as! List<T>
        } else if cehck == false {
            return arrayList2 as! List<T>

        }
        return arrayList1 as! List<T>
    }


}

我正在尝试使用Generic Type但没有运气

当我尝试使用函数ChooseList时,我收到了错误

Generic parameter 'T' could not be inferred

我不知道该怎么做,如果有另一种方式来存档我想要存档的东西

答案

我会建议一个替代解决方案。这是macOS,但与ios非常相似,它只是提供另一种选择。

假设我们有一个tableView,并希望根据用户选择的内容切换tableView中列出的内容。

给两个Realm对象Red Grape,White Grape

然后是一个包含两个名为Grape的列表的类。这类似于原始问题中的内容,但我想在我们的列表中使用更明确定义的项目。

class RedGrape: Object {
    @objc dynamic var grapeName = ""
}

class WhiteGrape: Object {
    @objc dynamic var grapeName = ""
}

class Grape: Object {
    let reds = List<RedGrape>()
    let whites = List<WhiteGrape>()
}

然后是一个在viewController中处理tableView的类,请注意这只是概念性的:

class ViewController: NSViewController, NSTableViewDelegate, NSTableViewDataSource {
    @IBOutlet weak var myTableView: NSTableView!

    var self.userSelection = 0 //changed by user: 0 for red, 1 for white
    var myGrape = //set up the Grape Object var from Realm

    override func viewDidLoad() {
        super.viewDidLoad()

        self.userSelection = 0

        self.myTableView.delegate = self
        self.myTableView.dataSource = self

        self.myTableView.reloadData()
    }


    func numberOfRows(in tableView: NSTableView) -> Int {
        if self.userSelection == 0 {
            return self.myGrape.reds.count
        } else {
            return self.myGrape.white.count 
        }
    }

    func tableView(_ tableView: NSTableView, 
                   viewFor tableColumn: NSTableColumn?,
                   row: Int) -> NSView? {
        var name = ""
        if self.userSelection == 0 {
            name = self.myGrape.reds[row].grapeName
        } else {
            name = self.myGrape.whites[row].grapeName
        }

        let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue:"MyCellView")

        if let cellView = self.myTableView.makeView(withIdentifier: cellIdentifier, 
                                                 owner: nil) as? NSTableCellView {
            cellView.textField?.stringValue = name
            return cellView
        }

        return nil
    }
}

从这里你可以在Grape类中实现更多的决策代码:

class Grape: Object {
    let reds = List<RedGrape>()
    let whites = List<WhiteGrape>()

    func rowCountFor(selection: Int) -> Int {
      if selection == 0 {
         return self.Grape.reds.count
      } else {
         return self.Grape.white.count 
      }

    func nameFor(selection: Int, forRow: Int) -> String {
       if selection == 0 {
         return self.reds[forRow]
      } else {
         return self.whites[forRow]
      }
    }
}

然后你的tableView numberOfRows成为

    func numberOfRows(in tableView: NSTableView) -> Int {
        self.myGrape.rowCountFor(selection: self.userSelection)
    }
另一答案

在这种情况下,arrayList1是SomeOtherType。列表不是那种类型,用as!演员是危险的。总是用作?

试试这个,

public var arrayList1 : DataType = List<realmList1>()
public var arrayList2 : DataType = List<realmList2>()


func ChooseList<T> (cehck : Bool) ->  List<T>? {

    if cehck == true {
        return arrayList1 as? List<T>
    } else if cehck == false {
        return arrayList2 as? List<T>

    }
    return nil
}
另一答案

我不认为你需要泛型,如果你的realmList 1和realmList 2继承自Object你可以编写你的chooseList方法,就像这样

    func ChooseList(cehck : Bool) ->  List<Object> {

    if cehck == true {
        return arrayList1 as! List<realmList1> // or just return arrayList1
    } else if cehck == false {
        return arrayList2 as! List<realmList2> // or just return arrayList2

    }
    return arrayList1 as! List<realmList1>
}

以上是关于如何在Swift中返回Realm列表?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Realm Swift 中使用 NOT IN

Realm Swift 返回所有 nil 值的对象

如何在 Realm Swift 中更新对象

如何使用 Realm swift 在本地设备上存储资产?

使用 Realm 进行 Swift XCTest UI 测试

如何在 Swift for Realm 模型中设置主键