簡體   English   中英

廣泛的Swift擴展協議

[英]Widespread Swift Protocol for Extensions

擴展協議

Swift 4.1,Xcode 9.3

我想知道,Swift中最重要的協議是什么? 我想做一個擴展,適用於可以設置的值。 這樣做的目的是使編寫更多的單行代碼更加容易。


我的擴展名:

注意:目前,我要擴展的“ 總體 ”協議是Equatable

extension Equatable {
    @discardableResult public func set(to variable: inout Self) -> Self {
        variable = self
        return self
    }
}

警告: 我希望能夠對不符合Equatable值使用.set(to: ) 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編寫了相同的擴展名,那么對於符合所有這三個協議的許多值,將有多個相同擴展名的建議。
  • 如果這不可能,那么我可以使用的最佳總體協議是什么?

獎勵問題: 擴展中有一種方法可以做與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 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中,無法將方法附加到每種可能的類型上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM