2016-04-20 12 views
0

が返されるので、オブジェクトを渡す再利用可能な関数を作成しようとしています(オブジェクトクラスは3つです)。 、コードは私のところでvalue of type object has no member idを吠える。これは、コードの行でこれを示していますarrayFromDB.append(items.id)ObjectをRealmに渡して再利用可能な関数を作成しようとすると、エラー

私のオブジェクトのすべての3がID

func deleteUnwanted (fromJSON:[Int], db: Object.Type) { 
    var arrayFromDB:[Int] = [Int]() 
    let realm = try! Realm() 
    let getFromDB = realm.objects(db) 
    for items in getFromDB { 
     arrayFromDB.append(items.id) 
    } 
... other stuff 

(エラーを与えるものではありません)機能

self.deleteUnwanted(self.catstringJson,db: LocalDataFolders.self) 
への呼び出し自体が含まれているので、それは奇妙です

オブジェクトクラス

class LocalDataF: Object { 

    dynamic var id:Int = 0 
    ... 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

class LocalDataC: Object { 
    dynamic var id:Int = 0 
    ... 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

class LocalDataA: Object { 
    dynamic var id:Int = 0 
    ... 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 
+0

私はRealmの何も知りませんが、一般的な機能を望んでいるようです。そうであれば、 'Object.Type'を使って' func deleteUnwanted (fromJSON:[Int]、db:T.Type) 'と定義する必要があります。また、 'id'プロパティを持つ型やプロトコルを定義し、関数内の' id'にアクセスするためにジェネリックパラメータを制約する必要があります。 – sgib

+0

これを試してみると、 '' T.Type '型の値を期待される引数型' Object.Type''に 'let getFromDB = realm.objects(db) 'の行に戻せません。 型は常に私はそれを一般的にするべきかどうかは分かりません。それは3つの異なるオブジェクトを持つことができます。 – SoundShock

+0

'func deleteUnwanted ...'を常にオブジェクトにすることを試みるかもしれませんが、 'id'プロパティを持つ型にキャストせずに' id'プロパティにアクセスすることはできません。 – sgib

答えて

1

レルムDBは、あなたの問題とは何の関係もありません。

スウィフトはアヒル型言語ではありません。すべてのオブジェクトにidのフィールドがあることは知っていますが、コンパイラに納得させる方法も見つけなければなりません。

protocol HasId { 

    associatedtype IdType 

    var id: IdType { get } 

} 

struct A: HasId { 
    var id: Int = -1 
} 

struct B: HasId { 
    var id: Int = -1 
} 

func listIds<T: HasId>(items: [T]) { 
    print(items.map { $0.id }) 
} 

listIds([A(id: 1), A(id: 2), A(id: 3)]) // [1, 2, 3] 
listIds([B(id: 4), B(id: 5), B(id: 6)]) // [4, 5, 6] 
関連する問題