updated take on dictionary extension. Removed unnecessary calls to optionalChain func. Simplified method internals.
This commit is contained in:
parent
0ed0fb49d8
commit
6263720e3d
@ -11,179 +11,158 @@ import Foundation
|
|||||||
public extension Dictionary {
|
public extension Dictionary {
|
||||||
|
|
||||||
/// Returns a Dictionary using the specified chain. An empty dictionary is returned if a dictionary for the chain does not exist
|
/// Returns a Dictionary using the specified chain. An empty dictionary is returned if a dictionary for the chain does not exist
|
||||||
func dictionaryWithChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> [String : Any] {
|
func dictionaryWithChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> [String: Any] {
|
||||||
|
|
||||||
guard let dictionary = optionalDictionaryWithChainOfKeysOrIndexes(keysOrIndexes) else {
|
return optionalDictionaryWithChainOfKeysOrIndexes(keysOrIndexes) ?? [:]
|
||||||
return [:]
|
|
||||||
}
|
|
||||||
return dictionary
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns an optional Dictionary using the specified chain. Returns nil if a dictionary for the chain does not exist
|
/// Returns an optional Dictionary using the specified chain. Returns nil if a dictionary for the chain does not exist
|
||||||
func optionalDictionaryWithChainOfKeysOrIndexes (_ keysOrIndexes: [Any]) -> [String : Any]? {
|
func optionalDictionaryWithChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> [String: Any]? {
|
||||||
|
|
||||||
return objectChainOfKeysOrIndexes(keysOrIndexes) as? [String: Any]
|
return objectChainOfKeysOrIndexes(keysOrIndexes) as? [String: Any]
|
||||||
}
|
}
|
||||||
|
|
||||||
func optionalDictionaryForKey(_ key: String) -> [String : Any]? {
|
func optionalDictionaryForKey(_ key: String) -> [String: Any]? {
|
||||||
|
|
||||||
return objectChainOfKeysOrIndexes([key]) as? [String: Any]
|
guard let key = key as? Key else { return nil }
|
||||||
|
|
||||||
|
return self[key] as? [String: Any]
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a String using the specified chain. An empty string is returned if a string for the chain does not exist
|
/// Returns a String using the specified chain. An empty string is returned if a string for the chain does not exist
|
||||||
func stringWithChainOfKeysOrIndexes(_ keysOrIndexes:[Any]) -> String {
|
func stringWithChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> String {
|
||||||
|
|
||||||
guard let string = objectChainOfKeysOrIndexes(keysOrIndexes) as? String else {
|
return objectChainOfKeysOrIndexes(keysOrIndexes) as? String ?? ""
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func stringOptionalWithChainOfKeysOrIndexes(_ keysOrIndexes:[Any]) -> String? {
|
func stringOptionalWithChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> String? {
|
||||||
|
|
||||||
return objectChainOfKeysOrIndexes(keysOrIndexes) as? String
|
return objectChainOfKeysOrIndexes(keysOrIndexes) as? String
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns an Array using the specified chain. Returns an empty array if an array for the chain does not exist
|
/// Returns an Array using the specified chain. Returns an empty array if an array for the chain does not exist
|
||||||
func arrayForChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> [Any] {
|
func arrayForChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> [Any] {
|
||||||
|
|
||||||
guard let array = objectChainOfKeysOrIndexes(keysOrIndexes) as? [Any] else {
|
return objectChainOfKeysOrIndexes(keysOrIndexes) as? [Any] ?? []
|
||||||
return []
|
|
||||||
}
|
|
||||||
return array
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func optionalArrayForChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> [Any]? {
|
func optionalArrayForChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> [Any]? {
|
||||||
|
|
||||||
return objectChainOfKeysOrIndexes(keysOrIndexes) as? [Any]
|
return objectChainOfKeysOrIndexes(keysOrIndexes) as? [Any]
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a Dictionary after looking up the specified key. An empty dictionary is returned if a dictionary for the key does not exist
|
/// Returns a Dictionary after looking up the specified key. An empty dictionary is returned if a dictionary for the key does not exist
|
||||||
func dictionaryForKey(_ key : String) -> [String : Any] {
|
func dictionaryForKey(_ key: String) -> [String: Any] {
|
||||||
|
|
||||||
return dictionaryWithChainOfKeysOrIndexes([key])
|
guard let key = key as? Key else { return [:] }
|
||||||
|
|
||||||
|
return self[key] as? [String: Any] ?? [:]
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a String after looking up the specified key. An empty string will be returned if a string for the key does not exist
|
/// Returns a String after looking up the specified key. An empty string will be returned if a string for the key does not exist
|
||||||
func stringForkey(_ key: String) -> String {
|
func stringForkey(_ key: String) -> String {
|
||||||
|
|
||||||
return stringWithChainOfKeysOrIndexes([key])
|
guard let key = key as? Key else { return "" }
|
||||||
|
|
||||||
|
return self[key] as? String ?? ""
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns a String after looking up the specified key. Nil will be returned if a string for the key does not exist
|
/// Returns a String after looking up the specified key. Nil will be returned if a string for the key does not exist
|
||||||
func optionalStringForKey(_ key: String) -> String? {
|
func optionalStringForKey(_ key: String) -> String? {
|
||||||
|
|
||||||
return objectChainOfKeysOrIndexes([key]) as? String
|
return objectChainOfKeysOrIndexes([key]) as? String
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Returns an Array after looking up the specified key. An empty array will be returned if an array for the key does not exist
|
/// Returns an Array after looking up the specified key. An empty array will be returned if an array for the key does not exist
|
||||||
func arrayForKey(_ key : String) -> [Any] {
|
func arrayForKey(_ key: String) -> [Any] {
|
||||||
|
|
||||||
return arrayForChainOfKeysOrIndexes([key])
|
guard let key = key as? Key else { return [] }
|
||||||
|
|
||||||
|
return self[key] as? [Any] ?? []
|
||||||
}
|
}
|
||||||
|
|
||||||
func optionalArrayForKey(_ key : String) -> [Any]? {
|
func optionalArrayForKey(_ key: String) -> [Any]? {
|
||||||
guard let key = key as? Key else {
|
|
||||||
return nil
|
guard let key = key as? Key else { return nil }
|
||||||
}
|
|
||||||
return self[key] as? [Any]
|
return self[key] as? [Any]
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return a Bool after looking up the specified key. This will return false if the key does not exist
|
/// Return a Bool after looking up the specified key. This will return false if the key does not exist
|
||||||
func boolForKey(_ key : String) -> Bool {
|
func boolForKey(_ key: String) -> Bool {
|
||||||
|
|
||||||
guard let bool = objectChainOfKeysOrIndexes([key]) as? Bool else {
|
guard let key = key as? Key else { return false }
|
||||||
return false
|
|
||||||
}
|
return self[key] as? Bool ?? false
|
||||||
return bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return a Bool after looking up the specified key. This will return false if the key does not exist
|
/// Return a Bool after looking up the specified key. This will return false if the key does not exist
|
||||||
func optionalBoolForKey(_ key : String) -> Bool? {
|
func optionalBoolForKey(_ key: String) -> Bool? {
|
||||||
|
|
||||||
guard let bool = objectChainOfKeysOrIndexes([key]) as? Bool else {
|
guard let key = key as? Key else { return nil }
|
||||||
return nil
|
|
||||||
}
|
return self[key] as? Bool ?? nil
|
||||||
return bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func lenientBoolForKey(_ key: String) -> Bool {
|
func lenientBoolForKey(_ key: String) -> Bool {
|
||||||
guard let key = key as? Key, let object = self[key] else {
|
|
||||||
return false
|
guard let key = key as? Key, let object = self[key] else { return false }
|
||||||
}
|
|
||||||
if let object = object as? NSNumber {
|
if let object = object as? NSNumber {
|
||||||
return object.boolValue
|
return object.boolValue
|
||||||
|
|
||||||
} else if let object = object as? NSString {
|
} else if let object = object as? NSString {
|
||||||
return object.boolValue
|
return object.boolValue
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func boolForChainOfKeysOrIndexes(_ keysOrIndexes:[Any])-> Bool {
|
func boolForChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> Bool {
|
||||||
guard let bool = objectChainOfKeysOrIndexes(keysOrIndexes) as? Bool else {
|
|
||||||
return false
|
return objectChainOfKeysOrIndexes(keysOrIndexes) as? Bool ?? false
|
||||||
}
|
|
||||||
return bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return a float from a string created by looking up the specified key. This will return 0.0 if the key does not exist
|
/// Return a float from a string created by looking up the specified key. This will return 0.0 if the key does not exist
|
||||||
func floatForKey(_ key: String) -> Float {
|
func floatForKey(_ key: String) -> Float {
|
||||||
|
|
||||||
guard let floatValue = objectChainOfKeysOrIndexes([key]) as? Float else {
|
return objectChainOfKeysOrIndexes([key]) as? Float ?? 0.0
|
||||||
return 0.0
|
|
||||||
}
|
|
||||||
|
|
||||||
return floatValue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func optionalCGFloatForKey(_ key: String) -> CGFloat? {
|
func optionalCGFloatForKey(_ key: String) -> CGFloat? {
|
||||||
guard let key = key as? Key else {
|
|
||||||
return nil
|
guard let key = key as? Key else { return nil }
|
||||||
}
|
|
||||||
return self[key] as? CGFloat
|
return self[key] as? CGFloat
|
||||||
}
|
}
|
||||||
|
|
||||||
func floatFromStringForKey(_ key:String) -> Float {
|
func floatFromStringForKey(_ key: String) -> Float {
|
||||||
|
|
||||||
let stringValue = stringForkey(key)
|
return Float(stringForkey(key)) ?? 0.0
|
||||||
|
|
||||||
guard let floatValue = Float(stringValue) else {
|
|
||||||
return 0.0
|
|
||||||
}
|
|
||||||
|
|
||||||
return floatValue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func int32ForKey(_ key: String) -> Int32 {
|
||||||
|
|
||||||
func int32ForKey(_ key:String) -> Int32 {
|
guard let key = key as? Key else { return 0 }
|
||||||
|
|
||||||
guard let intValue = objectChainOfKeysOrIndexes([key]) as? Int32 else {
|
return self[key] as? Int32 ?? 0
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
return intValue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func objectChainOfKeysOrIndexes(_ keysOrIndexes:[Any]) -> Any? {
|
private func objectChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> Any? {
|
||||||
|
|
||||||
var previousObject : Any? = self
|
var previousObject: Any? = self
|
||||||
|
|
||||||
for keyOrIndex in keysOrIndexes {
|
for keyOrIndex in keysOrIndexes {
|
||||||
|
if let nextDictionary = previousObject as? [String: Any],
|
||||||
if let nextDictionary = previousObject as? [String:Any],
|
|
||||||
let keyOrIndex = keyOrIndex as? String {
|
let keyOrIndex = keyOrIndex as? String {
|
||||||
|
|
||||||
previousObject = nextDictionary[keyOrIndex]
|
previousObject = nextDictionary[keyOrIndex]
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
else if let nextArray = previousObject as? [Any],
|
} else if let nextArray = previousObject as? [Any],
|
||||||
let keyOrIndex = keyOrIndex as? Int {
|
let keyOrIndex = keyOrIndex as? Int {
|
||||||
|
|
||||||
previousObject = nextArray[keyOrIndex]
|
previousObject = nextArray[keyOrIndex]
|
||||||
continue
|
|
||||||
}
|
} else {
|
||||||
else {
|
return nil
|
||||||
previousObject = nil
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user