Swift-Mirror類型轉(zhuǎn)字典

看了onevcat的文章,覺(jué)得看了一遍什么都沒(méi)記住,然后似乎又都理解了。這種感覺(jué)非常好,然后就playground中操作了一遍。原鏈接onevcat

Mirror最基本的用法我們都相對(duì)比較了解。

 struct Cat:Dictionaryable{
     var name:String
     var age:Int
 }  
let cat = Cat(name: "onevcat", age: 20)
let mirror = Mirror(reflecting: cat)
for child in mirror.children {
    print(child.label,child.value)
}  

通過(guò)這種方式我們可以通過(guò)反射打印出對(duì)象中所有的屬性信息

我們可以自定義一個(gè)協(xié)議,通過(guò)協(xié)議拓展的方式返回給我們要的Any

  protocol Dictionaryable{
     var value:Any{get}
  }

然后給一些基礎(chǔ)的數(shù)據(jù)類型默認(rèn)實(shí)現(xiàn)

    extension Int:Dictionaryable{ var value: Any{return self}}
    extension Double:Dictionaryable{ var value: Any{return self}}
    extension Bool:Dictionaryable{ var value: Any{return self}}
    extension String:Dictionaryable{ var value: Any{return self}}

通過(guò)協(xié)議拓展的方式,讓滿足它的其他類型通過(guò)Mirror的方式構(gòu)建字典

  extension Dictionaryable{

   var value:Any{
    //1.獲取Mirror
    //2.mirror的children
    //3.把mirror中的label和value拼起來(lái)
    //4.考慮異常的情況
    let mirror = Mirror(reflecting: self)
    var dict:[String:Any] = [:]
    for item in mirror.children {
        guard let label = item.label else { fatalError("Invalid key in child:key\(item)") }
        if let value = item.value as? Dictionaryable{
            dict[label] = value.value
        }else{
           fatalError("Invalid value in child:value\(item)")
        }
    }
    return dict
}
}

此時(shí)自定義一個(gè)struct遵循Dictionaryable,會(huì)發(fā)現(xiàn)可以打印出對(duì)應(yīng)的dict。

  struct Person:Dictionaryable{
     var name:String
     var cat:Cat 
   }
  let person = Person(name: "@David", cat: cat)
  print(person.value)

有對(duì)象嵌套也可以,因?yàn)閯偛诺娜〉檬莍tem.value.value。如果item.value自身是自定義類型的話,會(huì)發(fā)生具體方法的調(diào)用最后返回拼接好的dict。

當(dāng)然此時(shí)無(wú)法完成Array和Dictionary的轉(zhuǎn)換。此時(shí)我們要加入Array和Dictionary的拓展

Swift4.1之后已經(jīng)支持協(xié)議拓展,對(duì)拓展對(duì)象中的泛型進(jìn)行約束。

  extension Dictionary: DictionaryValue where Value: DictionaryValue  
  {
    var value: Any { return mapValues { $0.value } }
  }

   extension Array:Dictionaryable where Element:Dictionaryable{
     var value:Any{
    return ({$0.value})
     }
   }

但是在之前的版本還不行,我們沒(méi)有辦法對(duì)拓展類型中的泛型進(jìn)行約束。我們需要在返回的方法調(diào)用中進(jìn)行強(qiáng)制轉(zhuǎn)換。

 extension Array:Dictionaryable{

    var value:Any{
    return map({($0 as! Dictionaryable).value})
    }
 }

extension Dictionary:Dictionaryable{

var value:Any{
    return mapValues({$0 as! Dictionaryable}).value
}
}

完成之后我們就可以進(jìn)行Array和Dictionary的轉(zhuǎn)換了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,692評(píng)論 4 61
  • 0、 唉!嘶!嗨呀!滋! 你有沒(méi)有這樣一種感覺(jué),當(dāng)有人在你身邊唉聲嘆氣時(shí),你的情緒是否會(huì)受到影響從而導(dǎo)致你的內(nèi)心也...
    輕年小妖閱讀 5,805評(píng)論 12 8
  • Jon Snow ,you know nothin .這句話是看HBO系列劇 【權(quán)力的游戲-冰與火之歌】里...
    234ca81991b5閱讀 396評(píng)論 0 0

友情鏈接更多精彩內(nèi)容