在Swift中比较两个对象而不转换为特定类型

时间:2018-08-27 01:25:19

标签: swift generics

我试图比较两个对象,这些对象的类型在运行时已知,但在编译时未知。到目前为止,我有以下功能似乎可以正常工作:

 Unable to find a suitable output format for 'Bleach'
Bleach: Invalid argument

问题是,在编译时不一定知道类型符合/// Compares two objects of the given type. /// Returns -1 if a is "less than" b, 1 if a is "greater than" b, 0 if they are equal, and nil if no comparison could be made. func compare<T: Comparable>(type: T.Type, a: Any?, b: Any?) -> Int? { guard let at = a as? T, let bt = b as? T else { return nil } return at < bt ? -1 : at > bt ? 1 : 0 } 协议;我确实需要能够传递任何类型(Comparable),而不仅仅是Any.Type类型。然后,如果传入的类型不符合Comparable,我希望函数返回nil。我该怎么办?

编辑(30/08/2018):其他内容。我正在使用此函数对字符串,整数和其他Comparable类型的各种数组进行排序。但是,由于这些数组是通过反射检索的,因此在编译时不知道元素类型。 知道它们将始终为Comparable,但编译器并非如此。为了解决这个问题,我将类型作为单独的参数传递,如图所示。但是,由于我想保持逻辑尽可能通用,因此我在条件语句中执行此排序功能,该条件语句从数组中选择必要的类型。即使该数组的所有内容都符合Comparable[Any.Type]Comparable等),该数组的类型也必须为String.Type才能容纳所需的类型。

0 个答案:

没有答案