2017-12-16 5 views
0

ので、私は私のモデルは、このSwiftでレルムリストを返す方法は?

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> 
    } 


} 

のように見えるのUITableView

にそれらのいずれかを表示するためにそれらの間で選択することができ、私は2レルムのリストに

を持っていると私はhealper機能 を作成しようとしています私は一般的なタイプ を使用しようとしていますが、運がない

私はこの機能を使用しようとしましたChooseListは、私はそれを行う方法がわからない、と私はこの場合

+0

正確に何をしようとしているのかは少しはっきりしていますが、デザインを再検討したいことがあります。つまり、 'メイン' RealmModelには、Realmオブジェクトの2つのリストがあり、同時にアクセス可能であり、同時に2つの配列の1つを返す関数もあります。本質的に機能を重複します。レルムからRealmModelオブジェクトを取得したら、配列に直接アクセスできます。 someArray = aRealmModel.arrayList1とします。そのため、arrayList1またはarrayList2をtableViewデータソースとして使用できます。なぜ /汎用タイプを使用したいのかを明確にすることはできますか? – Jay

+0

アイデアは私のコードを複製したくないということです!、今はあなたが言及したとおりに正確に私のコードを複製します! 両方のリストが同じTableviewに表示されるので、ユーザーが使用するアクションに応じて切り替える必要があります。なぜ、正しいコンテンツを表示できるように最初にチェックする必要があるのですか。 私はこのようにする必要があるのは明らかだと思います。 – X901

+0

私はそれが正当なものだと思っていたからといってジェネリックタイプを使用しました。 – X901

答えて

0

I'LLのようなあなたのchooseListメソッドを書くことができ、ここでジェネリック医薬品が必要であることと思ういけない

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

をアーカイブしようとしているものをアーカイブする別の方法がある場合は、arrayList1はSomeOtherTypeでエラー

Generic parameter 'T' could not be inferred 

を得ました。 リストはそのタイプではなく、!キャストは危険です。常にとして使用?

私はあなたのrealmList1とrealmList2がObjectから継承されている場合、あなたはこの

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> 
} 
0

、これを試してみてください代わりの解決法を提案する。これはmacOSですが、iOSとよく似ており、別のオプションを提供するだけです。

tableViewがあり、ユーザーが選択した内容に応じてtableViewに表示されているものを切り替えるとします。

は2つのレルムを与えるRedGrape、WhiteGrape

オブジェクト、その後、ブドウと呼ばれるこれらの両方のリストを含むクラス。これは元の質問に似ていますが、リストで使用するために、より明確に定義された項目を使用したかったのです。

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 
    } 
} 

ここからは、ブドウのクラス内でより多くの意思決定のコードを実装することができます:

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

これは私が試した延期の事だった Iましたエラー: はタイプのreturn式を変換できません「リスト」タイプを返すための「一覧」 – X901

関連する問題