在Swift中使用Comparable扩展@objc协议

dtd

我想延长我的协议OptionComparable使用简单的.sort()方法。

下面的简短示例仅Equatable用于显示错误。

@objc protocol Option: Equatable {
    var title: String { get }
    var enabled: Bool { get }
    var position: Int { get }
}

func ==(lhs: Option, rhs: Option) -> Bool {
    return lhs.position == rhs.position
}

Option协议必须标记为@objc或继承自,NSObjectProtocol因为它将与一起使用UIKit

错误:

  1. @objc协议“ Option”无法优化非@objc协议“ Equatable”

  2. 协议“选项”只能用作通用约束,因为它具有“自身”或关联的类型要求

您对如何解决这个问题有什么建议吗?

克里斯蒂克

Equatable仅存在于Swift世界中,因此您不能将其扩展到Objective-C将使用的协议。尝试执行此操作将导致错误#1

有条件的协议Self(即协议声明中至少包含一种方法Self)不能用作函数或变量声明的参数,而只能用作通用子句的参数,例如func doSomething<T: Option>(argument: T)

EquatableOption协议声明中删除,并声明==为generic onOption将解决编译错误。至于排序,您还可以重载<运算符,并通过该运算符进行排序(无需实现Comparable):

@objc protocol Option {
    var title: String { get }
    var enabled: Bool { get }
    var position: Int { get }
}

func ==<T: Option>(lhs: T, rhs: T) -> Bool {
    return lhs.position == rhs.position
}

func <<T: Option>(lhs: T, rhs: T) -> Bool {
    return lhs.position < rhs.position
}

这样,您就可以将符合协议的对象传递给UIKit,并在快速代码中进行比较。

class A: NSObject, Option { .. }
class B: NSObject, Option { ... }

let a = A()
let b = B()
a == b  // compiles, and returns true if a and b have the same position
let c: [Option] = [a, b]
c.sort(<) // returns a sorted array by the `position` field

关于上述排序代码的一个重要说明:如果未为指定类型c,则编译器会将其类型推断为[NSObject],并且sort由于<运算符的歧义,该调用将无法编译您需要显式声明c为as [Option],以利用重载运算符。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章