IOS 12.1では、unarchiveObject(withFile:)
は廃止されました。
どのようにしてNSKeyedUnarchiver.unarchiveObject(withFile: String)
を変換して、NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(data: Data)
、またはNSKeyedUnarchiver.unarchivedObject(ofClasses: [AnyClass]
、からの呼び出しを使用できますか:Data)、またはNSKeyedUnarchiver.unarchivedObject(ofClass: NSCoding.Protocol, from: Data)
?
let fileData = try Data(contentsOf: URL)
のようなものを用意し、それらのメソッドの1つを使用してデータをアーカイブ解除する必要があると思います。しかし、私はそれを理解することができず、減価償却に付随する文書は役に立たない(少なくとも私には)。
アーカイブされたデータはかなり単純です-文字列の配列(このコードで定義されているクラスNameToBeSaved
の配列):
class NameToBeSaved: NSObject, NSCoding {
var name: String
init(userEnteredName: String) {
self.name = userEnteredName
super.init()
}
func encode(with aCoder: NSCoder) {
aCoder.encode(name, forKey: "name")
}
required init?(coder aDecoder: NSCoder) {
name = aDecoder.decodeObject(forKey: "name") as! String
super.init()
}
以下はunarchiveObject(withFile :)を呼び出すコードです-
init() {
if let archivedCategoryNames = NSKeyedUnarchiver.unarchiveObject(withFile: categoryNameArchiveURL.path) as? [NameToBeSaved] {
allCategories += archivedCategoryNames
} else {
for category in starterCategories {
let thisNewCategory = NameToBeSaved(userEnteredName: category)
createNewCategory(thisNewCategory)
}
sortCategories()
}
}
これが最良の解決策であるかどうかはわかりませんが、これは私のために変換を解決しました(古いコードは比較のためにコメントアウトされています):
init() {
do {
let rawdata = try Data(contentsOf: categoryNameArchiveURL)
if let archivedCategoryNames = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(rawdata) as! [NameToBeSaved]? {
allCategories += archivedCategoryNames
}
} catch {
print("Couldn't read file")
for category in starterCategories {
let thisNewCategory = NameToBeSaved(userEnteredName: category)
createNewCategory(thisNewCategory)
}
sortCategories()
}
/* if let archivedCategoryNames = NSKeyedUnarchiver.unarchiveObject(withFile: categoryNameArchiveURL.path) as? [NameToBeSaved] {
allCategories += archivedCategoryNames
} else {
for category in starterCategories {
let thisNewCategory = NameToBeSaved(userEnteredName: category)
createNewCategory(thisNewCategory)
}
sortCategories()
}
*/
}
問題:SKEmitterNodeとして使用するためにsksファイルをアーカイブ解除します。
古い方法、非推奨:
let filePath = Bundle.main.path(forResource: "myParticleEmitter", ofType: "sks")!
let burnerPathUnarchived = NSKeyedUnarchiver.unarchiveObject(withFile: burnerPath) as! SKEmitterNode
新しい方法:
do {
let fileURL = Bundle.main.url(forResource: "myParticleEmitter", withExtension: "sks")!
let fileData = try Data(contentsOf: fileURL)
let unarchivedData = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(burnerData) as! SKEmitterNode
} catch {
print("didn't work")
}
その後、次のことができます。
mySKEffectNode.addChild(unarchivedData)
mySKSpriteNode.addChild(mySKEffectNode)