1

64ビットで失われることなくUIColorをCoreDataに保存するにはどうすればよいですか? 32 ビットでは、正しい UIColor が返されます。

CoreData のセットアップ

  • 属性タイプ:変形可能
  • NSManagedObject サブクラス プロパティ: @NSManaged 変数の色: UIColor?

色の値が保存される前

color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)

出力例: 64 ビットで赤:

0.20000000000000018  

32ビットで赤を出力

0.199999928

色が CoreData から取得された後

color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)

出力例: 64 ビットで赤:

0.20000000298023224 

32ビットで赤を出力:

0.199999928

結果として生じる問題

== を使用した色比較は、値がわずかに異なるため、64 ビットでは失敗します。32 ビットではすべて問題なく、色の比較は成功します。

4

2 に答える 2

2

代わりに、データ変数に割り当てNSKeyedArchiver.archivedDataWithRootObject(color)て、Core Data ストアに保存します。

データを読み取るにはNSKeyedUnarchiver.unarchiveObjectWithData(colorData)、色変数に代入するだけです。


とにかくフロートを比較する方法を知りたい場合は、いつでもこれを参照できます

于 2015-05-25T09:33:06.917 に答える
1

これは私の問題を解決しました:

  1. CoreData 属性名をカスタム NSValueTransformer サブクラスに設定します: MQColorTransformer

  2. 次の NSValueTransformer サブクラスを実装しました (これは、Schemetrical が提案したように UIColor を NSData に変換しいますが、UIColor を自分の色プロパティに割り当てることができ、NSValueTransformer がシーンの背後で変換を処理するという利点があります):

NSValueTransformer サブクラス

import Foundation
import UIKit

@objc(MQColorTransformer) class MQColorTransformer: NSValueTransformer {

  override class func transformedValueClass() -> AnyClass{
      return NSData.classForCoder()
  }

  override func transformedValue(value: AnyObject!) -> AnyObject {

      // Transform UIColor to NSData
      let color = value as! UIColor

      var red: CGFloat = 0
      var green: CGFloat = 0
      var blue: CGFloat = 0
      var alpha: CGFloat = 0
      color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)

      var components:[CGFloat] = [red, green, blue, alpha]
      let dataFromColors = NSData(bytes: components,
          length: sizeofValue(components)*components.count)

      return dataFromColors

  }

  override func reverseTransformedValue(value: AnyObject!) -> AnyObject {

      // Transform NSData to UIColor
      let data = value  as! NSData
      var components = [CGFloat](count: 4, repeatedValue:0)
      var length=sizeofValue(components)

      data.getBytes(&components, length: length * components.count)
      let color = UIColor(red: components[0],
          green: components[1],
          blue: components[2],
          alpha: components[3])

      return color
  }
}
于 2015-05-25T09:57:55.093 に答える