[英]Widespread Swift Protocol for Extensions
我想知道,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: )
覆蓋面更廣,而無需多個實例呢?
Equatable
, CustomStringConvertible
, CVarArg
編寫了相同的擴展名,那么對於符合所有這三個協議的許多值,將有多個相同擴展名的建議。 獎勵問題: 擴展中有一種方法可以做與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.