如何在 Swift 中 return 领域列表?
How to return Realm list in Swift?
我有 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
我不知道该怎么做,如果有其他方法可以存档我要存档的内容
在这种情况下,arrayList1 是 SomeOtherType。
list不是那个类型的,同as! cast is dangerous.Always Use 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
}
如果你的 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>
}
我会建议一个替代解决方案。这是 macOS 但与 iOS 非常相似,它实际上只是提供另一种选择。
假设我们有一个 tableView 并且想要根据用户的选择切换 tableView 中列出的内容。
给出两个 Realm 对象 RedGrape, WhiteGrape
然后是一个 class,其中包含两个名为 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>()
}
然后是 class 处理 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:
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 个领域列表
而且我正在努力让治疗师发挥作用 所以我可以在它们之间进行选择以在 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
我不知道该怎么做,如果有其他方法可以存档我要存档的内容
在这种情况下,arrayList1 是 SomeOtherType。 list不是那个类型的,同as! cast is dangerous.Always Use 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
}
如果你的 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>
}
我会建议一个替代解决方案。这是 macOS 但与 iOS 非常相似,它实际上只是提供另一种选择。
假设我们有一个 tableView 并且想要根据用户的选择切换 tableView 中列出的内容。
给出两个 Realm 对象 RedGrape, WhiteGrape
然后是一个 class,其中包含两个名为 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>()
}
然后是 class 处理 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:
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)
}