广泛的扩展协议(protocol)
swift 4.1,Xcode 9.3
我想知道,Swift 中有哪些最重要的协议(protocol)。我想做一个适用于可以设置的值的扩展。这样做的目的是为了更容易编写更多一行代码。
我的分机:
注意:目前,我正在扩展的“overarching”协议(protocol)是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 个协议(protocol)的许多值。 - 如果这不可能,我可以使用的最佳总体协议(protocol)是什么?
奖励问题: 有没有办法在扩展中做一些与 extension Equatable where !(Element: CustomStringConvertible)
或 extension Equatable where !(Element == Int)
(使用 where
谓词进行排除)?
最佳答案
在大多数情况下,我强烈反对这种代码。 “一行”代码通常不是 Swift 的目标。简洁明了是目标,矛盾时胜负分明。以这种方式扩展 Any
(即使它是合法的)通常是一个非常糟糕的主意,因为 set(to:)
很容易发生冲突。
但在有限的情况下,这可能在单个文件或特殊用途中有用。在这种情况下,它很容易通过运算符实现。
infix operator -->
private func --> <T>(lhs: T, rhs: inout T) -> T {
rhs = lhs
return lhs
}
let ten = 10
var twenty = 0
(ten + 10) --> twenty
print(twenty)
// Prints "20"
执行您所描述的操作的更自然的方式是使用您明确遵守的协议(protocol)。例如:
protocol Settable {}
extension Settable {
@discardableResult public func set(to variable: inout Self) -> Self {
variable = self
return self
}
}
extension Int: Settable {}
extension String: Settable {}
extension Array: Settable {}
extension Optional: Settable {}
您可以将 Settable
附加到对此有用的任何类型,并且可以在项目的任何地方(甚至在其他模块中)提供这些扩展。在 Swift 中无法将方法附加到每种可能的类型。
关于swift - 广泛使用的 Swift 扩展协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50339232/