【问题标题】:How to fill struct object from formatted string?如何从格式化的字符串中填充结构对象?
【发布时间】:2018-03-05 08:24:51
【问题描述】:
struct Data {
    var DT: Date?
    var D1: Double
    var D2: Double
    var D3: Double
    var D4: Double
    var I1: Int
}

var data = [Data]()
var format = "yyyyMMdd;%f;%f;%f;%f;%d"
var test = "20170924;1.1;2.2;3.3;4.4;100"

使用format 将值从test 放入data 的最简单方法是什么? ps:格式中的分隔符可以是“,”或其他。

【问题讨论】:

  • 为了更清楚,您能否添加一个预期结果的示例?
  • 我想要 data[0].DT == 2017-09-24 00:00:00 UTC data[0].D1 == 1.1 ... 和 data[0].I1 == 100

标签: swift string struct format


【解决方案1】:

您可以使用以下函数来获取填充的Data 对象:

func getDesiredData(formattedString: String, dateFormat: String, separator: String) -> Data? {
    let array = formattedString.components(separatedBy: separator)

    //print(array.count)

    if array.count < 6 {
        // something went wrong seprating the formatted string
        return nil
    }

    guard let d1 = Double(array[1]), let d2 = Double(array[2]), let d3 = Double(array[3]), let d4 = Double(array[4]), let i1 = Int(array[5]) else {
        // something went wrong when converting string to doubles/int
        return nil
    }

    var formatter = DateFormatter()
    formatter.dateFormat = dateFormat
    let date = formatter.date(from: array[0])

    return Data(DT: date, D1: d1, D2: d2, D3: d3, D4: d4, I1: i1)
}

正如您在函数签名中看到的,您可以随意添加所需的内容:

  • formattedString,例如:“yyyyMMdd;%f;%f;%f;%f;%d”。
  • dateFormat,例如:“yyyyMMdd”。
  • separator,例如:“,”或“;”。

输出:

// happy case ";":
let test1 = getDesiredData(formattedString: "20170924;1.1;2.2;3.3;4.4;100", dateFormat: "yyyyMMdd", separator: ";")
dump(test1)

// happy case ",":
let test2 = getDesiredData(formattedString: "20170924,1.1,2.2,3.3,4.4,100", dateFormat: "yyyyMMdd", separator: ",")
dump(test2)

// wrong format:
let test3 = getDesiredData(formattedString: "wrong;format;goes;here", dateFormat: "yyyyMMdd", separator: ";")
dump(test3) // nil

// wrong separator:
let test4 = getDesiredData(formattedString: "20170924;1.1;2.2;3.3;4.4;100", dateFormat: "yyyyMMdd", separator: "!")
dump(test4) // nil

【讨论】:

  • 谢谢。我知道如何使用组件分离和拆分来做到这一点。但是是否可以使用格式快速制作它?例如, var str = String(format: "yyyyMMdd;%f;%f;%f;%f;%d", data[0],... ) 会给我一个使用格式的字符串,是否可以反其道而行之?
  • 嗯,这些问题可能与所要求的有关:stackoverflow.com/questions/24074479/… stackoverflow.com/questions/24051314/… 但我不太确定它们是否会成为您正在寻找的解决方案...
猜你喜欢
  • 2019-08-27
  • 1970-01-01
  • 2017-06-26
  • 2022-11-18
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
相关资源
最近更新 更多