От строки [String: Any] до строки «Key = Value» в Swift - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть структура, которая состоит из некоторых элементов, которые находятся в String, Bool и Int, давайте назовем это Struct A.У меня также есть другая структура, позволяющая назвать ее Struct B.

Struct A{
let name: String
let surname: String
let age: Int   
}

Struct B{
let columnId: Int
let value: String
}

У меня есть массив B, и я хочу присвоить значения A для B. Пример массива;

FirstElement (columnId: 1, значение: "name = myname") SecondElement (columnId: 2, значение: "surname = mysurname") ThirdElement (columnId: 3, значение: "age = 20")

Я могу получить все свойства структуры с расширением ниже;

extension Loopable {
func allProperties() throws -> [String: Any] {

    var result: [String: Any] = [:]

    let mirror = Mirror(reflecting: self)

    // Optional check to make sure we're iterating over a struct or class
    guard let style = mirror.displayStyle, style == .struct || style == .class else {
        throw NSError()
    }

    for (property, value) in mirror.children {
        guard let property = property else {
            continue
        }

        result[property] = value
    }

    return result
}
}

После того, как я получу все свойства, мне понадобится какая-то итерация; Мой вопрос заключается в том, как получить значение и ключ, например строку «значение = ключ», расположенную ниже «classA [i]»

 func setArray(){
 let classA = classA().getAllProperties()
    for i in 0..<deviceLogs.count{
        myArray.append(B(columnId: i, value: classA[i]) )
    }
}

РЕДАКТИРОВАТЬ: Iхотите получить все свойства со значениями внутри Struct A и использовать его в качестве String для значения свойства при создании объекта Struct B.

Ответы [ 2 ]

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

Изменить функцию setArray

func setArray(){
    let keysArray = Array(classA.keys)
    let valuesArray = Array(classA.values)

    let classA = classA().getAllProperties()
    for i in 0..<deviceLogs.count{
        let valueString = keysArray[i] + "=" + valuesArray[i]
        myArray.append(B(columnId: i, value: valueString) )
    }
}
0 голосов
/ 27 ноября 2018

Проверьте это

struct B {
    let columnId: Int
    let value: Any
}

protocol Properties {
    var allProperties: [Any] { get }
}

extension Properties {
    var allProperties: [Any] {
        return Mirror(reflecting: self).children.flatMap { $0 }
    }
}    

struct A: Properties {
    let name: String
    let surname: String
    let age: Int
}

Вот пример того, как вы можете его использовать:

let properties = A(name: "name", surname: "surname", age: 18).allProperties

// ПРИМЕЧАНИЕ: ваше свойство value в Bдолжен иметь тип Any вместо String

var list = [B]()
for (index, property) in properties.enumerated() {
    list.append(B(columnId: index, value: property))
}
...