2016-12-19 18 views
0

私は、 & NSKeyedUnarchiverのいくつかの複雑なデータをCore-Dataに保存しておいて、後でそれを私のアプリケーションで取得しています。 これまでは完全に動作していましたが、移行後はSwift 3.0が自分のコードに満足していないようです。NSKeyedArchiver&NSKeyedUnarchiver/Swift 3.0

私は私のコードで早期にこれをしました:ここ

 let masterArray = [firstArray, secondArray] as [Any] 
     let dataForApp:NSData = NSKeyedArchiver.archivedData(withRootObject: masterArray) as NSData 
     entityFieldsDico = ["dataForAppArray":dataForApp] 
     // Use entityFieldsDico to save dataForApp in Core-Data under the key "dataForAppArray". 

コードを取得する方法である:ここでは

 var firstArray = [Int](), secondArray = [CGFloat]() 
     ....... 
     // stores some values in firstArray and also in secondArray. 
     ....... 

は、データを格納するためのコードがどのように見えるかですデータは次のようになります。

if let archiveData = dbRecord.value(forKey: "dataForAppArray") { 
     let archiveArray = NSKeyedUnarchiver.unarchiveObject(with: archiveData as! Data) 
     firstArray = (archiveArray as! Array)[0] as [Int] 
     secondArray = (archiveArray as! Array)[1] as [CGFloat] 
    } 

この問題は、コードを取得している間に表示されます。それは単にビルド時にクラッシュします。

私はそれらの2行コメントアウトした場合:

 //firstArray = (archiveArray as! Array)[0] as [Int] 
     //secondArray = (archiveArray as! Array)[1] as [CGFloat] 

をプログラムがfirstArrayと&のデータが(明らかに)利用できないという事実を除いて、動作します。

私がそれらをコメントアウトしないと、私はクラッシュし、非常に長いメッセージは以下のようなもので終わります。 (私はメッセージを短くするために、いくつかの...(ドット)を追加します。)

............. 
0 swift     0x000000010d71fa3d PrintStackTraceSignalHandler(void*) + 45 
1 swift     0x000000010d71f466 SignalHandler(int) + 470 
2 libsystem_platform.dylib 0x00007fffa0c5a52a _sigtramp + 26 
3 libsystem_platform.dylib 0x0000000000000003 _sigtramp + 1597659891 
4 swift     0x000000010b25b4e3 swift::constraints::ConstraintGraphScope::~ConstraintGraphScope() + 899 
5 swift     0x000000010b2f45f4 swift::constraints::ConstraintSystem::solveSimplified(llvm::SmallVectorImpl<swift::constraints::Solution>&, swift::FreeTypeVariableBinding) + 24868 
........... 
Objects-normal/arm64/UP_ViewController.dia -emit-dependencies-path /Users/me/Library/Developer/Xcode/DerivedData/TheApp-dszaazmmftlmwbicuwcwaplkjdfs/Build/Intermediates/TheApp.build/Debug-iphoneos/TheApp.build/Objects-normal/arm64/UP_ViewController.d -emit-reference-dependencies-path /Users/me/Library/Developer/Xcode/DerivedData/TheApp-dszaazmmftlmwbicuwcwaplkjdfs/Build/Intermediates/TheApp.build/Debug-iphoneos/TheApp.build/Objects-normal/arm64/UP_ViewController.swiftdeps -o /Users/me/Library/Developer/Xcode/DerivedData/TheApp-dszaazmmftlmwbicuwcwaplkjdfs/Build/Intermediates/TheApp.build/Debug-iphoneos/TheApp.build/Objects-normal/arm64/UP_ViewController.o -embed-bitcode-marker 
1. While type-checking 'computeFunction' at /Users/me/Documents/iOS/TheApp/TheApp/UP_ViewController.swift:184:5 
2. While type-checking expression at [/Users/me/Documents/iOS/TheApp/TheApp/UP_ViewController.swift:235:17 - line:235:66] RangeText="firstArray = (archiveArray as! Array)[0] as [Int]" 

I誰もがこの種の問題を経験している、私はあなたがそれを解決した方法をお知らせください。

+0

私の答えをチェックアウト –

答えて

1

archiveArrayArray<Array<Any>>にキャストする必要があります。Any型の値を含む配列を取得できます。あなたのソリューションの

は今unarchiveObject両方の出力を区別することができますので、出力を印刷、その後Anyを返した

if let archiveData = dbRecord.value(forKey: "dataForAppArray") { 
      if let archiveArray = NSKeyedUnarchiver.unarchiveObject(with: archiveData as! Data) as? Array<Array<Any>> { 
       firstArray = archiveArray[0] as! [Int] 
       secondArray = archiveArray[1] as! [CGFloat] 
      } 

} 

のは

var firstArray = [Int](), secondArray = [CGFloat]() 
firstArray.append(1) 
firstArray.append(1) 
firstArray.append(1) 

secondArray.append(1.1) 
secondArray.append(1.2) 
secondArray.append(1.3) 

print(firstArray) //[1, 1, 1] 
print(secondArray) //[1.1, 1.2, 1.3] 

let masterArray = [firstArray, secondArray] as [Any] //[[1, 1, 1], [1.1, 1.2, 1.3]] 
let dataForApp:NSData = NSKeyedArchiver.archivedData(withRootObject: masterArray) as NSData 

を理解する打者のための例を見てみましょうです。

let archiveArray1 = NSKeyedUnarchiver.unarchiveObject(with: dataForApp as Data) 
print(archiveArray1!) 

出力は、出力が

[[1, 1, 1], [1.1, 1.2, 1.3]] 

なりますArray<Array<Any>>

if let archiveArray = NSKeyedUnarchiver.unarchiveObject(with: dataForApp as Data) as? Array<Array<Any>> { 
      print(archiveArray) 
} 

(
     (
     1, 
     1, 
     1 
    ), 
     (
     "1.1", 
     "1.2", 
     "1.3" 
    ) 
) 

今キャスト配列になりますあなたは私のポイントを理解してほしいです。

+0

こんにちは、あなたのソリューションは良いようです。私はそれを動作させるためにそれに取り組む必要があります。 私の最初の試行は失敗しました。私はあなたに知らせてくれるでしょう。 – Michel

+0

ありがとうミシェル –

+0

あなたはあなたの最初の試行で直面している問題は? –

関連する問題