ios - 在 Swift 中使用 PropertyListDecoder 时从 plist 解析浮点值时解码错误

标签 ios swift plist

我希望将一些十进制数字存储在 plist 中并根据请求检索它们。

plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>sessionLength</key>
    <integer>1800</integer>
    <key>name</key>
    <string>Sleeping</string>
    <key>generators</key>
    <array>
        <dict>
            <key>dynamic</key>
            <dict>
                <key>amplitude</key>
                <string>40,35,32,30,28,26,22,14,4</string>
                <key>beat</key>
                <string>3.8,3.3,3.0,3.0,2.8,2.6,2.4,2.0,2.0</string>
                <key>carrier</key>
                <string>1:3,1:5,1:6,1:5,1:6,1:5,1:6,1:4,1:3</string>
                <key>type</key>
                <integer>0</integer>
                <key>isoType</key>
                <integer>0</integer>
                <key>depth</key>
                <string>40,40,40,40,40,40,40,40,40</string>
            </dict>
            <key>static</key>
            <dict>
                <key>amplitude</key>
                <real>45</real>
                <key>beat</key>
                <real>2.4</real>
                <key>carrier</key>
                <real>180.6</real>
                <key>depth</key>
                <integer>40</integer>
                <key>type</key>
                <integer>0</integer>
                <key>isoType</key>
                <integer>0</integer>
            </dict>
        </dict>
        <dict>
            <key>dynamic</key>
            <dict>
                <key>amplitude</key>
                <string>40,40,40,40,40,40,40,40,40</string>
                <key>beat</key>
                <string>3.8,3.8,3.8,3.8,3.8,3.8,3.8,3.8,3.8</string>
                <key>carrier</key>
                <string>2:3,1:5,1:6,1:5,1:6,1:5,1:6,1:4,1:3</string>
                <key>type</key>
                <integer>0</integer>
                <key>isoType</key>
                <integer>0</integer>
                <key>depth</key>
                <string>40,40,40,40,40,40,40,40,40</string>
            </dict>
            <key>static</key>
            <dict>
                <key>amplitude</key>
                <integer>50</integer>
                <key>beat</key>
                <real>2</real>
                <key>carrier</key>
                <real>110</real>
                <key>depth</key>
                <integer>80</integer>
                <key>type</key>
                <integer>0</integer>
                <key>isoType</key>
                <integer>0</integer>
            </dict>
        </dict>
        <dict>
            <key>dynamic</key>
            <dict>
                <key>amplitude</key>
                <string>40,40,40,40,40,40,40,40,40</string>
                <key>beat</key>
                <string>3.8,3.8,3.8,3.8,3.8,3.8,3.8,3.8,3.8</string>
                <key>carrier</key>
                <string>1:5,1:5,1:6,1:5,1:6,1:5,1:6,1:4,1:3</string>
                <key>type</key>
                <integer>1</integer>
                <key>isoType</key>
                <integer>2</integer>
                <key>depth</key>
                <string>70,65,65,50,45,40,40,35,30</string>
            </dict>
            <key>static</key>
            <dict>
                <key>amplitude</key>
                <integer>55</integer>
                <key>beat</key>
                <real>4</real>
                <key>carrier</key>
                <integer>180</integer>
                <key>depth</key>
                <integer>90</integer>
                <key>type</key>
                <integer>0</integer>
                <key>isoType</key>
                <integer>0</integer>
            </dict>
        </dict>
    </array>
</dict>
</plist>

原始数据如下: enter image description here

我正在使用 Decodable 协议(protocol)来检索数据。

struct PresetData: Decodable {
    private enum CodingKeys: String, CodingKey {
        case name, sessionLength, generators
    }
    
    let name: String
    let sessionLength: Int
    let generators: [PresetStoredData]
}

struct PresetStoredData: Decodable {
    private enum CodingKeys: String, CodingKey {
        case `static`, dynamic
    }
    
    let `static`: PresetStoredItem
    let dynamic: PresetStoredDynamicItem
}

struct PresetStoredItem: Decodable {
    private enum CodingKeys: String, CodingKey {
        case amplitude, beat, carrier, depth, type, isoType
    }
    
    let amplitude: Float
    let beat: Float
    let carrier: Float
    let depth: Float
    
    let type: Int
    let isoType: Int
}

struct PresetStoredDynamicItem: Decodable {
    private enum CodingKeys: String, CodingKey {
        case amplitude, beat, carrier, depth, type, isoType
    }
    
    let amplitude: String
    let beat: String
    let carrier: String
    let depth: String
    
    let type: Int
    let isoType: Int
}

结果是“解析的属性列表编号 <2.4> 不适合 Float。”

编辑:解析方法:

let decoder = PropertyListDecoder()
    return try! decoder.decode(PresetData.self, from: data)

这对我来说没有意义。 知道出了什么问题吗?

最佳答案

考虑

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>amplitude</key>
    <real>45.0</real>
    <key>beat</key>
    <real>4.2</real>
    <key>carrier</key>
    <real>180.6</real>
</dict>
</plist>

如果您使用以下方式解码:

struct Preset: Decodable {
    let amplitude: Float
    let beat: Float
    let carrier: Float
}

您将收到

dataCorrupted(Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "beat", intValue: nil)], debugDescription: "Parsed property list number <4.2> does not fit in Float.", underlyingError: nil))

但是如果你将其更改为Double,它将起作用:

struct Preset: Decodable {
    let amplitude: Double
    let beat: Double
    let carrier: Double
}

关于ios - 在 Swift 中使用 PropertyListDecoder 时从 plist 解析浮点值时解码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63177259/

相关文章:

ios - 在后台运行 HTTP 请求

ios - SWIFT aws S3 异步下载?下载图像并填充表格 View

objective-c - 如何在 iOS 5 的 Info.plist 中创建 UIBackgroundModes 键

ios - 快速删除plist

ios - 使用自定义 iOS 框架绑定(bind) sqlite 数据库

c# - 单点触控中的 UIScrollView Hittest 功能

ios - 将 float View (即静态和固定)添加到 UITableViewController

ios - 快速删除 indexPath 处的部分

swift - 从所有 VC 中删除观察者 - swift

python - 在 OSX 启动时运行 Python 脚本