当枚举符合协议CustomStringConvertible时,是否可以从变量获取枚举描述?

时间:2017-03-06 13:01:20

标签: swift reflection enums swift3

当enum符合协议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 个答案:

答案 0 :(得分:1)

是的,您可以使用Swift的Mirror反射API。实例的枚举案例被列为镜像的子项,您可以打印其标签和值,如下所示:

function Save () {

            try {

                var req = {                   
                    DeliveryCode: value,

                }

                $.ajax({
                    url: URL,
                    type: 'POST',
                    data: req,
                    dataType: "json",
                    async: true,
                    success: function (result) {

                        resetLoadWaiting()

                    },
                    error: function (e) {

                    }
                });
            }
            catch (e) {


            }
        }