【发布时间】:2025-12-22 19:30:12
【问题描述】:
广泛的扩展协议
Swift 4.1,Xcode 9.3
我想知道,Swift 中有哪些最重要的协议。我想做一个适用于可以设置的值的扩展。这样做的目的是让编写更多单行代码更容易。
我的扩展:
注意:目前,我正在扩展的“总体”协议是Equatable。
extension Equatable {
@discardableResult public func set(to variable: inout Self) -> Self {
variable = self
return self
}
}
警告:我希望能够将.set(to: ) 用于不符合Equatable 的值。
用法:
let ten = 10
var twenty = 0
(ten + 10).set(to: &twenty)
print(twenty)
// Prints "20"
这在您需要设置和返回值时很有用,现在只需一行代码即可。
return value.set(to: &variable)
最后一个问题
我如何使.set(to: ) 影响更深远,而不需要它的多个实例?
- 例如,如果我为
Equatable、CustomStringConvertible、CVarArg编写了相同的扩展名,那么对于符合所有这 3 个协议的许多值,会有多个相同扩展名的建议。 - 如果这不可能,我可以使用的最佳总体协议是什么?
额外问题: 有没有办法在扩展程序中做一些与 extension Equatable where !(Element: CustomStringConvertible) 或 extension Equatable where !(Element == Int) 不同的事情(使用 where 谓词进行排除)?
【问题讨论】:
-
不幸的是,我认为这在当前的 Swift 中是不可能的。 :-(
-
set(to:)是个坏名字。您不是将接收器设置为参数,而是将参数设置为接收器。
标签: swift protocols where-clause swift-extensions inout