swift - 广泛使用的 Swift 扩展协议(protocol)

标签 swift protocols where-clause swift-extensions inout

广泛的扩展协议(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: ) 的影响更深远,而不需要它的多个实例?

  • 例如,如果我为 EquatableCustomStringConvertibleCVarArg 编写了相同的扩展,那么对于相同的扩展会有多个建议符合所有这 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/

相关文章:

MySQL:如果不存在,插入的最佳方式是什么?

Swift 在标签栏上只隐藏一个按钮

swift - 方法中使用的协议(protocol)静态变量

protocols - Zigbee 和 Zigbee PRO 有什么区别?

filesystems - 什么是文件系统协议(protocol),它是如何工作的?

php - mysql SELECT WHERE 查询在 elseif 循环内不执行任何操作并且没有错误

Swift 类型检查需要很长时间

ios - 需要过滤来自 URL 的结果

ios - 播放(非库)Apple Music 内容 - 请求失败

php - 使用连接表中的值连接多个表