2017-06-28 16 views
1

Swiftで実行時に属性データ型のタイプをチェックしたいと思います。挿入するときと同じように、エンティティ内の特定の属性が日付型または文字列型の値を受け入れるかどうかを確認したい。これはSwiftでどのように達成できるのですか?実行時にコアデータの属性タイプをチェックする方法は?

+2

これを確認してください。 https://stackoverflow.com/questions/24006165/how-do-i-print-the-type-or-class-of-a-variable-in-swift –

+0

例がありますか? – Siriss

+0

実際には、モデルは読み取り専用なので、実行時に属性とその型を知っているはずです。 – vadian

答えて

0

それはtype(of:) .E.gです。、

let test: Int = 0 
if type(of: test) == Int.self { 
    print("found") 
} 
+1

これは一般的なSwiftの場合には当てはまりますが、Core Dataの場合、Core Dataのリフレクション方法を使用する方が良いでしょう。 –

3

あなたはいつもモデルで定義されたプロパティの正しい種類を見つけるためにタイプのNSAttributeDescriptionあるエンティティの属性記述を使用することができます。

NSManagedObject、Personのサブクラスがあるとします。その後、あなたは、一般的には

@objc(Person) 
class Person: NSManagedObject { 
    @NSManaged 
    var name: String 

    @NSManaged 
    var age: NSNumber 

    @NSManaged 
    var dateOfBirth: Date 
} 

let person = NSEntityDescription.insertNewObject(forEntityName: "Person", into: context) as! Person 

if let attribute = person.entity.attributesByName["name"], 
         attribute.attributeType == .stringAttributeType { 

    // use your code here for custom logic 
    print("name is string") 
} 

if let attribute = person.entity.attributesByName["age"], 
         attribute.attributeType == .dateAttributeType { 

    // use your code here for custom logic 

    print("age is date") 
} 
0

を挿入する前にタイプを確認するには、次のコードからの例を使用することができ、あなたはあなたのコードを書く前に、あなたのモデルが何であるかを知っている必要があります。 読み込み専用モデルのイントロスペクションはやや愚かなようです。私はあなたがこれをやりたいと思っている理由を考えることはできませんが、あなたが共有していないという良い理由があると確信しています。

NSEntityDescriptionのmanagedObject entityクラスメソッド(サブクラス上)を見ることができます。または、モデルオブジェクト(context.persistentStoreCoordinator.managedObjectModel.entites)からすべてのエンティティの説明を直接取得することも、エンティティの名前を知っていればcontext.persistentStoreCoordinator. managedObjectModel.entitiesByName["EntityName"]を使用することもできます。エンティティの説明は、すべてのエンティティのプロパティについて説明します。それぞれの属性を調べて、その属性のタイプを示すNSAttributeDescriptionを得ることができます。

関連する問題