में सामान्य मापदंडों के कमी जोड़े मैं इस समारोह है:विस्तार
func flatten<Key: Hashable, Value>(dict: Dictionary<Key, Optional<Value>>) -> Dictionary<Key, Value> {
var result = [Key: Value]()
for (key, value) in dict {
guard let value = value else { continue }
result[key] = value
}
return result
}
आप देख सकते हैं, इस पर एक [Key: Value?]
शब्दकोश बदल देती है एक [Key: Value]
एक (वैकल्पिक) के बिना।
मैं केवल वर्ग है जो मूल्य किसी भी प्रकार की एक Optional
है के लिए एक नया विधि के साथ Dictionary
वर्ग का विस्तार करना चाहता था, लेकिन मैं शब्दकोश का जेनेरिक मानकों को बाधाओं को जोड़ने में असमर्थ हूँ।
यह है कि मैं क्या करने की कोशिश की है:
extension Dictionary where Value: Optional<Any> {
func flatten() -> [Key: Any] {
var result = [Key: Any]()
for (key, value) in self {
guard let value = value else { continue }
result[key] = value
}
return result
}
}
लेकिन त्रुटि के साथ विफल: क्योंकि जब आप एकदम सही प्रकार निर्दिष्ट नहीं कर सकते
// make sure only `Optional` conforms to this protocol
protocol OptionalEquivalent {
typealias WrappedValueType
func toOptional() -> WrappedValueType?
}
extension Optional: OptionalEquivalent {
typealias WrappedValueType = Wrapped
// just to cast `Optional<Wrapped>` to `Wrapped?`
func toOptional() -> WrappedValueType? {
return self
}
}
extension Dictionary where Value: OptionalEquivalent {
func flatten() -> Dictionary<Key, Value.WrappedValueType> {
var result = Dictionary<Key, Value.WrappedValueType>()
for (key, value) in self {
guard let value = value.toOptional() else { continue }
result[key] = value
}
return result
}
}
let a: [String: String?] = ["a": "a", "b": nil, "c": "c", "d": nil]
a.flatten() //["a": "a", "c": "c"]
:
Type 'Value' constrained to non-protocol type 'Optional<Any>'
आप कर सकते हैं 'चीनी वापसी()' को 'वापसी स्वयं' के रूप में लागू करें। मैं व्यक्तिगत रूप से इस प्रोटोकॉल 'वैकल्पिक कन्वर्टिबल' और 'चीनीकास्ट() '' toOptional() 'को कॉल करने की सलाह देता हूं, लेकिन आपका तरीका भी ठीक है। –
आप सही हैं, मैं अपना कोड – cezheng
अपडेट करूंगा जो सामान्य सीमाओं को हल करने का एक बहुत ही रचनात्मक तरीका है। मैं शायद इसे और अधिक स्थानों में उपयोग करूंगा। धन्यवाद – redent84