【问题标题】:How to return Realm list in Swift?如何在 Swift 中返回领域列表?
【发布时间】:2017-12-16 12:25:39
【问题描述】:

我有 2 个领域列表

我正在尝试制作治疗功能 所以我可以在它们之间进行选择以在 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>
    }


}

我正在尝试使用通用类型 但没有运气

当我尝试使用功能 ChooseList 时出现错误

Generic parameter 'T' could not be inferred

我不知道该怎么做,如果有其他方法可以存档我要存档的内容

【问题讨论】:

  • 有点不清楚你到底想做什么,但你可能想重新考虑设计。实际上,“主”RealmModel 有两个可公开访问的 Realm 对象列表,同时还有一个函数也返回两个数组之一;本质上是重复的功能。一旦你从 Realm 中检索了你的 RealmModel 对象,就可以直接访问这些数组;让 someArray = aRealmModel.arrayList1。因此扩展它,arrayList1 或 arrayList2 可以用作 tableView 数据源。你能解释一下为什么要使用 / Generic Type 吗?
  • 这个想法是我不想复制我的代码! ,现在我确实复制了我的代码,就像你提到的那样!两个列表都将显示在同一个 Tableview 上,因此我需要根据用户将使用的操作在它们之间切换,这就是为什么我需要先检查才能显示正确的内容。我想现在很清楚为什么我需要这样做
  • 顺便说一句,我确实使用 Generic Type 只是因为我认为它是正确的使用方法,也就是说,我只是在尝试。

标签: swift realm realm-mobile-platform


【解决方案1】:

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

假设我们有一个 tableView 并且想要根据用户的选择来切换 tableView 中列出的内容。

给两个 Realm 对象 RedGrape、WhiteGrape

然后是一个包含两个名为 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)
    }

【讨论】:

    【解决方案2】:

    在这种情况下,arrayList1 是 SomeOtherType。 List 不是那种类型,用 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
    }
    

    【讨论】:

      【解决方案3】:

      如果你的 realmList1 和 realmList2 是从 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>
      }
      

      【讨论】:

      • 这是我尝试的第一个错误:无法将类型“List”的返回表达式转换为返回类型“List
      猜你喜欢
      • 1970-01-01
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多