オプションプロトコルを拡張してデフォルト値を提供できるようにするために、Swiftでプロトコルとプロトコル拡張を使い分ける別の方法が見つかりました。スウィフトここでプロパティが実装されているかどうかを確認する条件
私はここでこのことについてブログ記事を書いた:https://janthielemann.de/random-stuff/providing-default-values-optional-string-empty-optional-string-swift-3-1/
をポストの要旨は、私がnilまたは空になっているオプションの文字列にデフォルト値を提供するために、クリーンで簡単な方法を必要としていることです。これを行うために、私はEmptyableプロトコルエンドがそうのようなオプションのプロトコル拡張作成:
protocol Emptyable {
var isEmpty: Bool { get }
}
extension Optional where Wrapped: Emptyable {
func orWhenNilOrEmpty<T: Emptyable>(_ defaultValue: T) -> T {
switch(self) {
case .none:
return defaultValue
case .some(let value) where value.isEmpty:
return defaultValue
case .some(let value):
return value as! T
}
}
}
extension String: Emptyable {}
を今の質問はです:私はEmptyableプロトコルを取り除き、代わりにするかどうかを条件付きチェックを持って得ることができます方法はありますまたはプロパティまたは関数がジェネリック型で実装されていないので、isEmpty
の各型ごとにorNhenOrEmpty()が自動的に取得されます。
UPDATE
パウロによって示唆されるように、Tジェネリックが実際に必要と私は(少なくとも私はそう思うでもすばやくアクセスし、より便利な使用のための演算子を作成されません。私を修正すること自由に感じ、I新しいことを学び、自分自身を改善することはいつでもうれしい)。
私はそれを "not empty nil coalescing"演算子と呼んでいます(名前を付け加えることができますか?うまくいけば、いつの日か、それは誰かを助けます:
protocol Emptyable {
var isEmpty: Bool { get }
}
infix operator ???: NilCoalescingPrecedence
extension Optional where Wrapped: Emptyable {
func orWhenNilOrEmpty(_ defaultValue: Wrapped) -> Wrapped {
switch(self) {
case .none:
return defaultValue
case .some(let value) where value.isEmpty:
return defaultValue
case .some(let value):
return value
}
}
static func ???(left: Wrapped?, right: Wrapped) -> Wrapped {
return left.orWhenNilOrEmpty(right)
}
}
extension String: Emptyable {}
extension Array: Emptyable {}
extension MyStruct: Emptyable {
let text: String
let number: Int
var isEmpty: Bool { return text.isEmpty && number == 0 }
init(text: String, number: Int) {
self.text = text
self.number = number
}
}
let mandatoryNotEmptyString = optionalOrEmptyString ??? "Default Value"
let mandatoryNotEmptyStruct = optionalOrEmptyStruct ??? MyStruct(name: "Hello World", number: 1)
'orWhenNilOrEmpty'関数は本当に汎用である必要がありますか? 'T'を' Wrapped'で置き換えることはできませんか?あるいは、あなたのAPIが任意にタイプされたデフォルト値をサポートするように設計されていますか? –
あなたは正しいです。 Tは実際にはまったく必要ありません。ヒントありがとう! – xxtesaxx