dictionary extension
This commit is contained in:
parent
839eee33e8
commit
2926ca951c
@ -21,6 +21,7 @@
|
|||||||
/* End PBXAggregateTarget section */
|
/* End PBXAggregateTarget section */
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
01DF561421F90ADC00CC099B /* Dictionary+MFConvenience.swift in Sources */ = {isa = PBXBuildFile; fileRef = 01DF561321F90ADC00CC099B /* Dictionary+MFConvenience.swift */; };
|
||||||
30349BF11FCCA78A00546A1E /* MVMCoreSessionTimeHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 30349BEF1FCCA78A00546A1E /* MVMCoreSessionTimeHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
30349BF11FCCA78A00546A1E /* MVMCoreSessionTimeHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 30349BEF1FCCA78A00546A1E /* MVMCoreSessionTimeHandler.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
30349BF21FCCA78A00546A1E /* MVMCoreSessionTimeHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 30349BF01FCCA78A00546A1E /* MVMCoreSessionTimeHandler.m */; };
|
30349BF21FCCA78A00546A1E /* MVMCoreSessionTimeHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 30349BF01FCCA78A00546A1E /* MVMCoreSessionTimeHandler.m */; };
|
||||||
881D26931FCC9D180079C521 /* MVMCoreErrorObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 881D268F1FCC9D180079C521 /* MVMCoreErrorObject.m */; };
|
881D26931FCC9D180079C521 /* MVMCoreErrorObject.m in Sources */ = {isa = PBXBuildFile; fileRef = 881D268F1FCC9D180079C521 /* MVMCoreErrorObject.m */; };
|
||||||
@ -142,6 +143,7 @@
|
|||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
01DF561321F90ADC00CC099B /* Dictionary+MFConvenience.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+MFConvenience.swift"; sourceTree = "<group>"; };
|
||||||
0A11030B20864F94008ADD90 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
|
0A11030B20864F94008ADD90 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||||
0A11030C20864F9A008ADD90 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
0A11030C20864F9A008ADD90 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Localizable.strings"; sourceTree = "<group>"; };
|
||||||
30349BEF1FCCA78A00546A1E /* MVMCoreSessionTimeHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreSessionTimeHandler.h; sourceTree = "<group>"; };
|
30349BEF1FCCA78A00546A1E /* MVMCoreSessionTimeHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MVMCoreSessionTimeHandler.h; sourceTree = "<group>"; };
|
||||||
@ -339,6 +341,7 @@
|
|||||||
8876D5D91FB50AB000EB2E3D /* Categories */ = {
|
8876D5D91FB50AB000EB2E3D /* Categories */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
01DF561321F90ADC00CC099B /* Dictionary+MFConvenience.swift */,
|
||||||
8876D5DA1FB50AB000EB2E3D /* NSArray+MFConvenience.h */,
|
8876D5DA1FB50AB000EB2E3D /* NSArray+MFConvenience.h */,
|
||||||
8876D5DB1FB50AB000EB2E3D /* NSArray+MFConvenience.m */,
|
8876D5DB1FB50AB000EB2E3D /* NSArray+MFConvenience.m */,
|
||||||
8876D5DC1FB50AB000EB2E3D /* NSDecimalNumber+MFConvenience.h */,
|
8876D5DC1FB50AB000EB2E3D /* NSDecimalNumber+MFConvenience.h */,
|
||||||
@ -689,6 +692,7 @@
|
|||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
8876D5C81FB50A9E00EB2E3D = {
|
8876D5C81FB50A9E00EB2E3D = {
|
||||||
CreatedOnToolsVersion = 9.1;
|
CreatedOnToolsVersion = 9.1;
|
||||||
|
LastSwiftMigration = 1010;
|
||||||
ProvisioningStyle = Automatic;
|
ProvisioningStyle = Automatic;
|
||||||
};
|
};
|
||||||
AF954914206EAEAD000095EC = {
|
AF954914206EAEAD000095EC = {
|
||||||
@ -788,6 +792,7 @@
|
|||||||
8876D5F51FB50AB000EB2E3D /* UILabel+MFCustom.m in Sources */,
|
8876D5F51FB50AB000EB2E3D /* UILabel+MFCustom.m in Sources */,
|
||||||
AFBB96B31FBA3B590008D868 /* MVMCoreGetterUtility.m in Sources */,
|
AFBB96B31FBA3B590008D868 /* MVMCoreGetterUtility.m in Sources */,
|
||||||
AF43A7071FC4D7A2008E9347 /* MVMCoreObject.m in Sources */,
|
AF43A7071FC4D7A2008E9347 /* MVMCoreObject.m in Sources */,
|
||||||
|
01DF561421F90ADC00CC099B /* Dictionary+MFConvenience.swift in Sources */,
|
||||||
AFBB96B11FBA3B590008D868 /* MVMCoreDispatchUtility.m in Sources */,
|
AFBB96B11FBA3B590008D868 /* MVMCoreDispatchUtility.m in Sources */,
|
||||||
AFBB965B1FBA3A570008D868 /* FreeBeeUrlObject.m in Sources */,
|
AFBB965B1FBA3A570008D868 /* FreeBeeUrlObject.m in Sources */,
|
||||||
AFEA17A9209B6A1C00BC6740 /* MVMCoreBlockOperation.m in Sources */,
|
AFEA17A9209B6A1C00BC6740 /* MVMCoreBlockOperation.m in Sources */,
|
||||||
@ -934,6 +939,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BITCODE_GENERATION_MODE = bitcode;
|
BITCODE_GENERATION_MODE = bitcode;
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_IDENTITY = "";
|
CODE_SIGN_IDENTITY = "";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
@ -951,6 +957,8 @@
|
|||||||
PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCore;
|
PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCore;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
|
SWIFT_VERSION = 4.2;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
@ -959,6 +967,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
BITCODE_GENERATION_MODE = bitcode;
|
BITCODE_GENERATION_MODE = bitcode;
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_IDENTITY = "";
|
CODE_SIGN_IDENTITY = "";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
@ -975,6 +984,7 @@
|
|||||||
PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCore;
|
PRODUCT_BUNDLE_IDENTIFIER = com.vzw.MVMCore;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_VERSION = 4.2;
|
||||||
TARGETED_DEVICE_FAMILY = "1,2";
|
TARGETED_DEVICE_FAMILY = "1,2";
|
||||||
};
|
};
|
||||||
name = Release;
|
name = Release;
|
||||||
|
|||||||
174
MVMCore/MVMCore/Categories/Dictionary+MFConvenience.swift
Normal file
174
MVMCore/MVMCore/Categories/Dictionary+MFConvenience.swift
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
//
|
||||||
|
// Dictionary+MFConvenience.swift
|
||||||
|
// mobilefirst
|
||||||
|
//
|
||||||
|
// Created by Seshamani, Shreyas on 1/5/17.
|
||||||
|
// Copyright © 2017 Verizon Wireless. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
public extension Dictionary {
|
||||||
|
|
||||||
|
/// Returns a Dictionary using the specified chain. An empty dictionary is returned if a dictionary for the chain does not exist
|
||||||
|
public func dictionaryWithChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> [String : Any] {
|
||||||
|
|
||||||
|
guard let dictionary = optionalDictionaryWithChainOfKeysOrIndexes(keysOrIndexes) else {
|
||||||
|
return [:]
|
||||||
|
}
|
||||||
|
return dictionary
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns an optional Dictionary using the specified chain. Returns nil if a dictionary for the chain does not exist
|
||||||
|
public func optionalDictionaryWithChainOfKeysOrIndexes (_ keysOrIndexes: [Any]) -> [String : Any]? {
|
||||||
|
|
||||||
|
return objectChainOfKeysOrIndexes(keysOrIndexes) as? [String: Any]
|
||||||
|
}
|
||||||
|
|
||||||
|
public func optionalDictionaryForKey(_ key: String) -> [String : Any]? {
|
||||||
|
|
||||||
|
return objectChainOfKeysOrIndexes([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
|
||||||
|
public func stringWithChainOfKeysOrIndexes(_ keysOrIndexes:[Any]) -> String {
|
||||||
|
|
||||||
|
guard let string = objectChainOfKeysOrIndexes(keysOrIndexes) as? String else {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return string
|
||||||
|
}
|
||||||
|
|
||||||
|
public func stringOptionalWithChainOfKeysOrIndexes(_ keysOrIndexes:[Any]) -> 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
|
||||||
|
public func arrayForChainOfKeysOrIndexes(_ keysOrIndexes: [Any]) -> [Any] {
|
||||||
|
|
||||||
|
guard let array = objectChainOfKeysOrIndexes(keysOrIndexes) as? [Any] else {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
return array
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a Dictionary after looking up the specified key. An empty dictionary is returned if a dictionary for the key does not exist
|
||||||
|
public func dictionaryForKey(_ key : String) -> [String : Any] {
|
||||||
|
|
||||||
|
return dictionaryWithChainOfKeysOrIndexes([key])
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a String after looking up the specified key. An empty string will be returned if a string for the key does not exist
|
||||||
|
public func stringForkey(_ key: String) -> String {
|
||||||
|
|
||||||
|
return stringWithChainOfKeysOrIndexes([key])
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns a String after looking up the specified key. Nil will be returned if a string for the key does not exist
|
||||||
|
public func optionalStringForKey(_ key: String) -> 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
|
||||||
|
public func arrayForKey(_ key : String) -> [Any] {
|
||||||
|
|
||||||
|
return arrayForChainOfKeysOrIndexes([key])
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return a Bool after looking up the specified key. This will return false if the key does not exist
|
||||||
|
public func boolForKey(_ key : String) -> Bool {
|
||||||
|
|
||||||
|
guard let bool = objectChainOfKeysOrIndexes([key]) as? Bool else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return bool
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return a Bool after looking up the specified key. This will return false if the key does not exist
|
||||||
|
public func optionalBoolForKey(_ key : String) -> Bool? {
|
||||||
|
|
||||||
|
guard let bool = objectChainOfKeysOrIndexes([key]) as? Bool else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return bool
|
||||||
|
}
|
||||||
|
|
||||||
|
public func lenientBoolForKey(_ key: String) -> Bool {
|
||||||
|
guard let key = key as? Key, let object = self[key] else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if let object = object as? NSNumber {
|
||||||
|
return object.boolValue
|
||||||
|
} else if let object = object as? NSString {
|
||||||
|
return object.boolValue
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
public func boolForChainOfKeysOrIndexes(_ keysOrIndexes:[Any])-> Bool {
|
||||||
|
guard let bool = objectChainOfKeysOrIndexes(keysOrIndexes) as? Bool else {
|
||||||
|
return 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
|
||||||
|
public func floatForKey(_ key: String) -> Float {
|
||||||
|
|
||||||
|
guard let floatValue = objectChainOfKeysOrIndexes([key]) as? Float else {
|
||||||
|
return 0.0
|
||||||
|
}
|
||||||
|
|
||||||
|
return floatValue
|
||||||
|
}
|
||||||
|
|
||||||
|
public func floatFromStringForKey(_ key:String) -> Float {
|
||||||
|
|
||||||
|
let stringValue = stringForkey(key)
|
||||||
|
|
||||||
|
guard let floatValue = Float(stringValue) else {
|
||||||
|
return 0.0
|
||||||
|
}
|
||||||
|
|
||||||
|
return floatValue
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public func int32ForKey(_ key:String) -> Int32 {
|
||||||
|
|
||||||
|
guard let intValue = objectChainOfKeysOrIndexes([key]) as? Int32 else {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
return intValue
|
||||||
|
}
|
||||||
|
|
||||||
|
private func objectChainOfKeysOrIndexes(_ keysOrIndexes:[Any]) -> Any? {
|
||||||
|
|
||||||
|
var previousObject : Any? = self
|
||||||
|
|
||||||
|
for keyOrIndex in keysOrIndexes {
|
||||||
|
|
||||||
|
if let nextDictionary = previousObject as? [String:Any],
|
||||||
|
let keyOrIndex = keyOrIndex as? String {
|
||||||
|
|
||||||
|
previousObject = nextDictionary[keyOrIndex]
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
else if let nextArray = previousObject as? [Any],
|
||||||
|
let keyOrIndex = keyOrIndex as? Int {
|
||||||
|
|
||||||
|
previousObject = nextArray[keyOrIndex]
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
previousObject = nil
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return previousObject
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user