我试图比较两个对象,这些对象的类型在运行时已知,但在编译时未知。到目前为止,我有以下功能似乎可以正常工作:
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
才能容纳所需的类型。