簡體   English   中英

如何在NSManagedObject子類中將Transformable屬性用作其實際類型?

[英]How can I use a Transformable attribute as its actual type in a NSManagedObject subclass?

剛剛開始一個項目。 數據模型文件具有一個實體,該實體具有可轉換的單個屬性。 應該是NS/CGRect 我讓Xcode創建了相應的NSManagedObject子類文件。 對於“ MyThing.swift”,我得到了:

import Foundation
import CoreData

class MyThing: NSManagedObject {
// Insert code here to add functionality to your managed object subclass
}

我得到了“ MyThing + CoreDataProperties.swift”:

import Foundation
import CoreData

extension MyThing {
    @NSManaged var myBounds: NSObject?
}

我希望該屬性成為實際的CGRect ,因此我需要一個NSData <-> NSValue <-> NSRect轉換鏈。 我已經在接口構建器中的“屬性類型”下將“ NSKeyedUnarchiveFromDataTransformer”作為名稱。 我要添加(和/或更改)什么來傳遞CGRect值?

還是我不這樣做,而是通過NSValue包裝的CGRect代替? (我希望CoreData能夠處理所有NSData <-> NSValue轉換。)

因為CGRect不是類而是struct,所以我建議創建另一個屬性,該屬性將通過適當的轉換訪問原始變量。 然后僅使用該屬性。

class MyThing {
    var boundsValue : NSValue?

}

extension MyThing {
    var bounds : CGRect {
        get {
            if let value = boundsValue {
                value.CGRectValue()
            }
            return CGRectNull
        }
        set {
            boundsValue =  NSValue(CGRect: newValue)
        }
    }
}

只要您的可轉換類型符合NSCoding,Core Data就會為您處理其余的工作。 我在NSManagedObjects使用了NSAttributedString ,僅更改了CoreData提供的在運行時生成的id -type。

如果要擁有自己的類型的屬性,即MyAwesomeObject ,請確保實現initWithCoder:encodeWithCoder:

因此,對於您的情況,為了將CGRects與CoreData存儲在一起,您需要將它們包裝在實現上述方法的類中。 這是因為CGRect不符合NSCoding協議,因此不能直接存儲為可轉換屬性。

當然,您的另一個選擇是將xywidthheight作為屬性存儲,並且具有在awakeFromFetchawakeFromInsert計算的過渡屬性,或者只是一種便捷方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM