Не могу сохранить Bool в Swift - PullRequest
0 голосов
/ 15 ноября 2018

Я новичок в Swift (фон в C ++) и пытаюсь сделать очень простую вещь: сохранить Bool.Это прекрасно работает, если я преобразую bool в строку, которая является либо «A», либо «B», а затем преобразую обратно, но если я сохраню bool напрямую с помощью encode и aDecoder, Bool каждый раз возвращается ноль.Ничего не могу найти в интернете.

Как вы можете видеть ниже, я просто подставляю строку для Bool, и она работает.

func boolwontsave(aBool:Bool) -> String {
    if aBool {
        return "A"
    }
    return "B"
}

func encode(with aCoder: NSCoder) {

    aCoder.encode(name, forKey: PropertyKey.name)
    aCoder.encode(number, forKey: PropertyKey.number)
    aCoder.encode(boolwontsave(aBool: ispresent), forKey: PropertyKey.present)

}

required convenience init?(coder aDecoder: NSCoder) {

    // The name is required. If we cannot decode a name string, the initializer should fail.
    guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else {
        os_log("Unable to decode the name for a player object.", log: OSLog.default, type: .debug)
        return nil
    }

    let number = aDecoder.decodeObject(forKey: PropertyKey.number) as? String

    guard let localpresent = aDecoder.decodeObject(forKey: PropertyKey.present) as? String else {
        print("got the nil")
        os_log("Unable to decode the ispresent for a player object.", log: OSLog.default, type: .debug)
        return nil
    }


    // Must call designated initializer.
    self.init(name:name, number:number, present: localpresent == "A")

}

Не нужно сохранять Bools?Это кажется не элегантным.

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Используйте decodeBool (forKey key: String) вместо decodeObject (forKey: String)

DecodeBool декодирует и возвращает логическое значение, которое ранее было закодировано с помощью encode (_: forKey :) и связано со строковым ключом.

aCoder.encode(true, forKey: PropertyKey.present)
aCoder.decodeBool(forKey: PropertyKey.present)
0 голосов
/ 15 ноября 2018

Очень легко сохранить Bool, если вы используете правильный API.

В терминах NSCoding a Bool это , а не объект, существует метод decodeBool(forKey.

required convenience init?(coder aDecoder: NSCoder) {

    // The name is required. If we cannot decode a name string, the initializer should fail.
    guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else {
        os_log("Unable to decode the name for a player object.", log: OSLog.default, type: .debug)
        return nil
    }

    let number = aDecoder.decodeObject(forKey: PropertyKey.number) as? String
    let localpresent = aDecoder.decodeBool(forKey: PropertyKey.present)

    // Must call designated initializer.
    self.init(name:name, number:number, present: localpresent)

}

func encode(with aCoder: NSCoder) {
    aCoder.encode(name, forKey: PropertyKey.name)
    aCoder.encode(number, forKey: PropertyKey.number)
    aCoder.encode(ispresent, forKey: PropertyKey.present)
}

В Swift 4+ я бы предпочел собственный протокол Codable над ограниченным NSCoding.

  • NSCoding требуется класс , унаследованный от NSObject.
  • Codable может использоваться для любой структуры, класса и перечисления, соответствующих протоколу.
...