一个简单的实用工具,用于通过将 Swift 对象转换为由分隔符分隔的 String
,以尽可能小的空间序列化该对象。
如果您发现 SimpleSerialize
有用,并希望帮助支持其持续开发和维护,请考虑进行少量捐赠,尤其是在商业产品中使用它时。
正是通过像您一样的贡献者的支持,我才能继续构建、发布和维护高质量、文档完善的 Swift Package(例如 SimpleSerialize
),并且是免费的。
Swift Package Manager(Xcode 11 及以上)
https://github.com/Appracatappra/SimpleSerializer.git
。为什么不用 CocoaPods 或 Carthage 等?
支持多个依赖项管理器会使维护一个库的复杂度呈指数级增长,并且非常耗时。
由于 Swift Package Manager 已与 Xcode 11(及更高版本)集成,因此它是最容易支持的选择。
SimpleSerializer
提供了一种简单的方法,可以通过将 Swift 对象转换为由分隔符分隔的 String
,以尽可能小的空间简单地序列化和反序列化该对象。 此外,您可以完全控制要编码/解码的属性。
您可以定义一个 enum
来跟踪用于序列化的分隔符。例如
enum Divider:String, Codable {
case gameTile = ";"
case tileElement = ">"
case tileBag = "<"
case word = "/"
case player = "$"
case playerElement = "^"
case gridCell = "!"
case gridCellElement = "@"
case gridCol = "#"
case bonus = "%"
case gameState = "|"
case storedWord = "&"
}
以下代码显示了序列化和反序列化简单对象的示例
@Observable class BonusSpot {
// MARK: - Properties
/// The amount of the bonus.
var multiplier:Int = 0
/// If `true`, the bonus is active, else it is not.
var isEnabled:Bool = false
// MARK: - Computed Properties
/// Returns the `BonusSpot` as a serialized string.
var serialized:String {
let serializer = Serializer(divider: Divider.bonus)
.append(multiplier)
.append(isEnabled)
return serializer.value
}
// MARK: - Initializers
/// Creates a new instance.
/// - Parameters:
/// - multiplier: The bonus amount.
/// - isEnabled: If `true`, the bonus is active, else it is not.
init(multiplier: Int, isEnabled: Bool = true) {
self.multiplier = multiplier
self.isEnabled = isEnabled
}
/// Creates a new instance from a serialized string.
/// - Parameter value: The serialized string representing the `BonusSpot`.
init(from value:String) {
let deserializer = Deserializer(text: value, divider: Divider.bonus)
self.multiplier = deserializer.int()
self.isEnabled = deserializer.bool()
}
}
注意:请记住在序列化和反序列化给定属性时保持相同的顺序,因为它们依赖于特定的顺序。
以下代码显示了序列化和反序列化复杂对象的示例
@Observable class GameGridCell {
// MARK: - Properties
/// The current tile that has been played at this location.
var playedTile:GameTile? = nil
/// A tile that the current player is starting to build a new word with.
var inPlayTile:GameTile? = nil
/// An available bonus at this grid location.
var bonus:BonusSpot? = nil
// MARK: - Computed Properties
/// Returns the gird cell as a serialized string.
var serialized:String {
let serializer = Serializer(divider: Divider.gridCell)
.append(encodeTile(playedTile))
.append(encodeTile(inPlayTile))
.append(encodeBonus(bonus))
return serializer.value
}
/// Returns the tile currently on top at this location or `nil` if no tile is available.
var tile:GameTile? {
if let tile = inPlayTile {
return tile
} else {
return playedTile
}
}
// MARK: - Initializers
/// Creates a new empty instance.
init() {
}
/// Creates a new instance from a serialized string.
/// - Parameter value: The serialized string holding a grid cell.
init(from value:String) {
let deserializer = Deserializer(text: value, divider: Divider.gridCell)
self.playedTile = decodeTile(from: deserializer.string())
self.inPlayTile = decodeTile(from: deserializer.string())
self.bonus = decodeBonus(from: deserializer.string())
}
// MARK: - Functions
/// Encodes a `GameTile`.
/// - Parameter tile: The tile to encode.
/// - Returns: Returns the tile as a serialized string or `(e)` if the `GameTile` is `nil`
private func encodeTile(_ tile:GameTile?) -> String {
if let tile {
return tile.serialized
} else {
return "(e)"
}
}
/// Decodes a `GameTile` from the given serialized string.
/// - Parameter value: The serialized string holding the `GameTile`.
/// - Returns: Returns the `GameTile` or `nil` if the value was `(e)`.
private func decodeTile(from value:String) -> GameTile? {
if value == "(e)" {
return nil
} else {
return GameTile(from: value)
}
}
/// Encodes a `BonusSpot`.
/// - Parameter bonus: The `BonusSpot` to encode.
/// - Returns: Returns the encoded `BonusSpot` or `(e)` if the spot was `nil`.
private func encodeBonus(_ bonus:BonusSpot?) -> String {
if let bonus {
return bonus.serialized
} else {
return "(e)"
}
}
/// Decodes a `BonusSpot` from the given serialized string.
/// - Parameter value: The serialized string holding the `BonusSpot`.
/// - Returns: Returns the `BonusSpot` or `nil` if the value was `(e)`.
private func decodeBonus(from value:String) -> BonusSpot? {
if value == "(e)" {
return nil
} else {
return BonusSpot(from: value)
}
}
}
注意:任何
nil
属性都将被编码为字符串属性"(e)"
。
此 Package 包含所有功能的完整 DocC 文档。