2017-03-06 50 views
3

當枚舉符合協議CustomStringConvertible時,是否可以從變量獲取枚舉描述?簡化的定義是:當枚舉符合協議CustomStringConvertible時,是否可以從變量獲取枚舉描述?

enum myEnum: CustomStringConvertible { 

    case one(p1: Int) 
    case two(p: CGPoint) 
    case aaa1 
    case aaa2 

    var description: String { 
    return "useless text" 
    } 
} 

沒有協議很容易:

let testCases = [en.one(p1: 10), en.two(p: CGPoint(x: 2, y: 3)), en.aaa1, en.aaa2] 
testCases.forEach{ 
    print(String(reflecting: $0), terminator: "\t\t") 
} 
=> "en.one(10)  en.two((2.0, 3.0))  en.aaa1  en.aaa2" 

但隨着協議,我只能夠獲得前兩種情況

testCases.forEach{ 
    Mirror(reflecting: $0).children.forEach{ label, value in 
     print(label == nil ? value : (label!, value)) 
    } 
} 
=> ("one", 10), ("two", (2.0, 3.0)) 

因此,案件.aaa1。 aaa2沒有孩子,所以我不能將這些情況彼此分開(當然除了開關櫃)。在目前的情況下,我可以擴展該枚舉的功能,但不能編輯以前完成的功能。

有沒有辦法得到這種情況下的一般字符串描述?

回答

1

是的,你可以使用Swift的Mirror反射API。實例的枚舉情況下,被列爲鏡的孩子,你可以打印的標籤和值是這樣的:

extension myEnum { 
    var description: String { 
     let mirror = Mirror(reflecting: self) 
     var result = "" 
     for child in mirror.children { 
      if let label = child.label { 
       result += "\(label): \(child.value)" 
      } else { 
       result += "\(child.value)" 
      } 
     } 
     return result 
    } 
} 
+1

也許這是不是上面清楚,但要求是: 1的描述是傳統的財產,它是不可能改變它的邏輯 2.我需要得到類似於調試器描述的「字符串描述」。例如:「en.aaa1」「en.aaa2」「en.two((2.0,3.0))」等 當然,不用每種情況都使用開關:) –