如何在Swift中返回Realm列表?

问题描述 投票:0回答:3

我有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

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

swift realm realm-mobile-platform
3个回答
0
投票

我会建议一个替代解决方案。这是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)
    }

0
投票

在这种情况下,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
}

0
投票

我不认为你需要泛型,如果你的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>
}
© www.soinside.com 2019 - 2024. All rights reserved.