代码之家  ›  专栏  ›  技术社区  ›  Emre Önder

Swift中从[String:Any]到“Key=Value”字符串

  •  0
  • Emre Önder  · 技术社区  · 7 年前

    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
    }
    

    第一个元素(columnId:1,值:“name=myname”) 第二个元素(columnId:2,值:“姓氏=mysurname”)

    我可以通过以下扩展获得结构的所有属性;

    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]”下面获得类似“value=key”字符串的值和键的方法吗

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

    我希望在结构A中获取所有属性及其值,并在创建结构B对象时将其用作值属性的字符串。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Nilanshu Jaiswal    7 年前

    修改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) )
        }
    }
    
        2
  •  1
  •   Satish    7 年前

    看看这个

    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))
    }
    
    推荐文章