Я пытаюсь работать с GameplayKit и SpriteKit, используя редактор сцен в Xcode.Я новичок в SpriteKit и также не использовал NSSecureEncoding раньше.Честно говоря, довольно новый способ.
У меня есть базовый подкласс GKComponent с одним целочисленным и строковым свойством, реализованным следующим образом.
import Foundation
import GameplayKit
@objc
class BasicComponent: GKComponent {
@GKInspectable var number: Int = 0
@GKInspectable var text: String = " "
struct CoderKeys {
static let stringKey = "StringKey"
static let integerKey = "IntegerKey"
}
override static var supportsSecureCoding: Bool {
return true
}
required convenience init?(coder aDecoder: NSCoder) {
self.init(coder: aDecoder)
if let num = aDecoder.decodeObject(of: NSNumber.self, forKey: CoderKeys.integerKey) { self.number = num.intValue }
if let tex = aDecoder.decodeObject(of: NSString.self, forKey: CoderKeys.stringKey) { self.text = tex as String }
}
override func encode(with aCoder: NSCoder) {
super.encode(with: aCoder)
aCoder.encode(self.number as NSNumber, forKey: CoderKeys.integerKey)
aCoder.encode(self.text as NSString, forKey: CoderKeys.stringKey)
}
}
Каждый раз, когда я добавляю этот компонент к узлу, Xcode молча вылетает при сохранении сцены (автосохранение или намеренно).Обратный след в файле журнала сбоев XCode показывает NSInvalidArgumentException:
UNCAUGHT EXCEPTION (NSInvalidArgumentException): *** -[__NSPlaceholderArray initWithObjects:count:]: attempt to insert nil object from objects[3]
UserInfo: (null)
Hints:
Backtrace:
0 __exceptionPreprocess (in CoreFoundation)
1 DVTFailureHintExceptionPreprocessor (in DVTFoundation)
2 objc_exception_throw (in libobjc.A.dylib)
3 -[CFPrefsConfigurationFileSource initWithConfigurationPropertyList:containingPreferences:] (in CoreFoundation)
4 -[__NSPlaceholderArray initWithObjects:count:] (in CoreFoundation)
5 +[NSArray arrayWithObjects:count:] (in CoreFoundation)
6 -[GTFSceneCustomComponentProperty initWithCoder:] (in GameToolsFoundation)
7 _decodeObjectBinary (in Foundation)
8 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] (in Foundation)
9 -[NSDictionary(NSDictionary) initWithCoder:] (in Foundation)
10 _decodeObjectBinary (in Foundation)
11 _decodeObject (in Foundation)
12 -[NSKeyedUnarchiver decodeObjectForKey:] (in Foundation)
13 -[NSKeyedUnarchiver decodeObjectOfClasses:forKey:] (in Foundation)
14 -[GTFSceneCustomComponent initWithCoder:] (in GameToolsFoundation)
15 _decodeObjectBinary (in Foundation)
16 -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:] (in Foundation)
17 -[NSArray(NSArray) initWithCoder:] (in Foundation)
18 _decodeObjectBinary (in Foundation)
19 _decodeObject (in Foundation)
20 -[NSKeyedUnarchiver decodeObjectForKey:] (in Foundation)
Также новый при чтении следов назад, но мне кажется, что init? (Coder :) терпит неудачу и возвращает нулевой объект, который вызываетошибка.
Кроме того, если я удаляю свойство String, это работает безупречно.Я не знаю, что вызывает инициацию?потерпеть неудачу ...
В любом случае, я мог бы быть далеко от базы, но я совершенно уверен, что упускаю что-то простое и буду выглядеть глупо, но я просто не могу понять это.
Спасибо за любую помощь.