├── .gitignore ├── Package.swift ├── README.md ├── Sources └── Transformers │ ├── Data+Extensions.swift │ └── Dictionary+Extensions.swift ├── Transformers-macOS ├── Info.plist └── Transformers_macOS.h ├── Transformers-tvOS ├── Info.plist └── Transformers_tvOS.h ├── Transformers.xcodeproj ├── project.pbxproj └── xcshareddata │ └── xcschemes │ ├── Transformers-iOS.xcscheme │ ├── Transformers-macOS.xcscheme │ └── Transformers-tvOS.xcscheme ├── Transformers ├── Info.plist └── Transformers.h └── TransformersTests ├── DataExtensionTests.swift ├── DictionaryExtensionTests.swift └── Info.plist /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | Pods/ 3 | Carthage/ 4 | build/ 5 | *.pbxuser 6 | !default.pbxuser 7 | *.mode1v3 8 | !default.mode1v3 9 | *.mode2v3 10 | !default.mode2v3 11 | *.perspectivev3 12 | !default.perspectivev3 13 | *.xcworkspace 14 | !default.xcworkspace 15 | xcuserdata 16 | *.moved-aside 17 | .idea 18 | *.DS_Store 19 | .*~ 20 | 21 | 22 | #fastlane 23 | fastlane/README.md 24 | fastlane/report.xml 25 | fastlane/test_output/ 26 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:4.0 2 | // The swift-tools-version declares the minimum version of Swift required to build this package. 3 | 4 | import PackageDescription 5 | 6 | let package = Package( 7 | name: "Transformers", 8 | products: [ 9 | .library(name: "Transformers", targets: ["Transformers"]), 10 | ], 11 | dependencies: [ 12 | // Dependencies declare other packages that this package depends on. 13 | // .package(url: /* package url */, from: "1.0.0"), 14 | ], 15 | targets: [ 16 | // Targets are the basic building blocks of a package. A target can define a module or a test suite. 17 | // Targets can depend on other targets in this package, and on products in packages which this package depends on. 18 | .target(name: "Transformers", 19 | dependencies: []), 20 | ] 21 | ) 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 2 | [![Platform](https://img.shields.io/badge/Platform-iOS|macOS|tvOS-4BC51D.svg?style=flat)](https://github.com/webfrogs/Transformers) 3 | [![Swift Package Manager compatible](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) 4 | 5 | *Transformers* is a framework to transform things elegantly using the power of Swift programming language. 6 | 7 | > Note: Support Swift version: 4.1 or newer 8 | 9 | ## Feature 10 | 11 | - Cast JSON data with type. 12 | - Cast a swift dictionary to swift model which confirms `Codable` protocol. 13 | - Cast a swift array whose item type is dictionary to swift model array whose items confirm `Codable` protocol. 14 | 15 | ## Installation 16 | 17 | ### Manual 18 | 19 | Download the project, and drag the `Core` folder to your project. 20 | 21 | ### Carthage 22 | 23 | Add this to `Cartfile` 24 | 25 | ``` 26 | github "webfrogs/Transformers" ~> 1.0 27 | ``` 28 | 29 | ### Swift Package Manager 30 | 31 | ``` 32 | dependencies: [ 33 | .package(url: "https://github.com/webfrogs/Transformers.git", .upToNextMinor(from: "1.0.0")), 34 | ] 35 | ``` 36 | 37 | ## Usage 38 | 39 | The most common scene in iOS programming is handle JSON data. 40 | 41 | ### Handle JSON 42 | 43 | ```swift 44 | let jsonString = """ 45 | {"key1": "value2"} 46 | """ 47 | let value1: String? = jsonString.data(using: String.Encoding.utf8) 48 | .flatMap({$0.toDictionary()}) 49 | .flatMap({$0.value(key: "key1")}) 50 | print(value1 ?? "") 51 | ``` 52 | 53 | ### RxSwift 54 | 55 | If you also use [RxSwift](https://github.com/ReactiveX/RxSwift) in your project. *Transformers* can be easily integrated with RxSwift, and there is no need to transform JSON data fetched from http server to a model manually. All you have to do is define a model which confirms *Codable* protocol and use *Transformers* with the *map* function provided by RxSwift. 56 | 57 | Here is a demo code: 58 | 59 | ```swift 60 | struct GithubAPIResult: Codable { 61 | let userUrl: String 62 | let issueUrl: String 63 | 64 | enum CodingKeys: String, CodingKey { 65 | case userUrl = "user_url" 66 | case issueUrl = "issues_url" 67 | } 68 | } 69 | 70 | let request = URLRequest(url: URL(string: "https://api.github.com")!) 71 | let apiResult: Observable = URLSession.shared 72 | .rx.data(request: request) 73 | .map(Data.jsonToModelHandler) 74 | apiResult.subscribe(onNext: { (result) in 75 | print(result) 76 | }).disposed(by: kDisposeBag) 77 | ``` 78 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /Sources/Transformers/Data+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Data+Extensions.swift 3 | // Transformers-iOS 4 | // 5 | // Created by Carl Chen on 2018/4/11. 6 | // Copyright © 2018 nswebfrog. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public struct Errors { 12 | public enum Json: Error { 13 | case toModelFailed 14 | case toModelArrayFailed 15 | } 16 | } 17 | 18 | public extension Data { 19 | func toDictionary() -> [String: Any]? { 20 | return p_serialize() as? [String: Any] 21 | } 22 | 23 | func toArray() -> [T]? { 24 | return p_serialize() as? [T] 25 | } 26 | 27 | func jsonToModel() -> T? where T: Codable { 28 | let model = try? JSONDecoder().decode(T.self, from: self) 29 | return model 30 | } 31 | 32 | func jsonToModelArray() -> [T]? where T: Codable { 33 | let modelArray = try? JSONDecoder().decode([T].self, from: self) 34 | return modelArray 35 | } 36 | 37 | static func jsonToModelHandler(data: Data) throws -> T where T: Codable { 38 | guard let result: T = data.jsonToModel() else { 39 | throw Errors.Json.toModelFailed 40 | } 41 | return result 42 | } 43 | 44 | static func jsonToModelArrayHandler(data: Data) throws -> [T] where T: Codable { 45 | guard let result: [T] = data.jsonToModelArray() else { 46 | throw Errors.Json.toModelArrayFailed 47 | } 48 | return result 49 | } 50 | } 51 | 52 | private extension Data { 53 | func p_serialize() -> Any? { 54 | let obj = try? JSONSerialization.jsonObject(with: self, options: []) 55 | return obj 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /Sources/Transformers/Dictionary+Extensions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Dictionary+Extensions.swift 3 | // Transformers-iOS 4 | // 5 | // Created by Carl Chen on 2018/4/11. 6 | // Copyright © 2018 nswebfrog. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | 11 | public extension Dictionary where Key == String, Value == Any { 12 | func value(key: String) -> T? { 13 | return self[key].flatMap({ $0 as? T }) 14 | } 15 | 16 | func value(keyPath: String) -> T? { 17 | let keys = keyPath.components(separatedBy: ".") 18 | if keys.count == 1 { 19 | return value(key: keys[0]) 20 | } 21 | var dic: [String: Any]? = self 22 | (0.. 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSHumanReadableCopyright 22 | Copyright © 2017 nswebfrog. All rights reserved. 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Transformers-macOS/Transformers_macOS.h: -------------------------------------------------------------------------------- 1 | // 2 | // Transformers_macOS.h 3 | // Transformers-macOS 4 | // 5 | // Created by Carl Chen on 23/11/2017. 6 | // Copyright © 2017 nswebfrog. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for Transformers_macOS. 12 | FOUNDATION_EXPORT double Transformers_macOSVersionNumber; 13 | 14 | //! Project version string for Transformers_macOS. 15 | FOUNDATION_EXPORT const unsigned char Transformers_macOSVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /Transformers-tvOS/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Transformers-tvOS/Transformers_tvOS.h: -------------------------------------------------------------------------------- 1 | // 2 | // Transformers_tvOS.h 3 | // Transformers-tvOS 4 | // 5 | // Created by Carl Chen on 23/11/2017. 6 | // Copyright © 2017 nswebfrog. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for Transformers_tvOS. 12 | FOUNDATION_EXPORT double Transformers_tvOSVersionNumber; 13 | 14 | //! Project version string for Transformers_tvOS. 15 | FOUNDATION_EXPORT const unsigned char Transformers_tvOSVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /Transformers.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 48; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | C316767F207E10AF005E8858 /* DataExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C316767E207E10AF005E8858 /* DataExtensionTests.swift */; }; 11 | C32E37101FC663B3000FACD0 /* Transformers.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C32E37061FC663B3000FACD0 /* Transformers.framework */; }; 12 | C32E37171FC663B3000FACD0 /* Transformers.h in Headers */ = {isa = PBXBuildFile; fileRef = C32E37091FC663B3000FACD0 /* Transformers.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13 | C32E373C1FC67E9E000FACD0 /* Transformers_tvOS.h in Headers */ = {isa = PBXBuildFile; fileRef = C32E372E1FC67E9D000FACD0 /* Transformers_tvOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14 | C32E374C1FC67F20000FACD0 /* Transformers_macOS.h in Headers */ = {isa = PBXBuildFile; fileRef = C32E374A1FC67F20000FACD0 /* Transformers_macOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15 | C35FC60C207F2ED900E6C36B /* Dictionary+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35FC60A207F2ED900E6C36B /* Dictionary+Extensions.swift */; }; 16 | C35FC60D207F2ED900E6C36B /* Dictionary+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35FC60A207F2ED900E6C36B /* Dictionary+Extensions.swift */; }; 17 | C35FC60E207F2ED900E6C36B /* Dictionary+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35FC60A207F2ED900E6C36B /* Dictionary+Extensions.swift */; }; 18 | C35FC60F207F2ED900E6C36B /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35FC60B207F2ED900E6C36B /* Data+Extensions.swift */; }; 19 | C35FC610207F2ED900E6C36B /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35FC60B207F2ED900E6C36B /* Data+Extensions.swift */; }; 20 | C35FC611207F2ED900E6C36B /* Data+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35FC60B207F2ED900E6C36B /* Data+Extensions.swift */; }; 21 | C35FC613207F309000E6C36B /* DictionaryExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C35FC612207F309000E6C36B /* DictionaryExtensionTests.swift */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXContainerItemProxy section */ 25 | C32E37111FC663B3000FACD0 /* PBXContainerItemProxy */ = { 26 | isa = PBXContainerItemProxy; 27 | containerPortal = C32E36FD1FC663B3000FACD0 /* Project object */; 28 | proxyType = 1; 29 | remoteGlobalIDString = C32E37051FC663B3000FACD0; 30 | remoteInfo = Transformers; 31 | }; 32 | /* End PBXContainerItemProxy section */ 33 | 34 | /* Begin PBXFileReference section */ 35 | C316767E207E10AF005E8858 /* DataExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataExtensionTests.swift; sourceTree = ""; }; 36 | C32E37061FC663B3000FACD0 /* Transformers.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Transformers.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 37 | C32E37091FC663B3000FACD0 /* Transformers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Transformers.h; sourceTree = ""; }; 38 | C32E370A1FC663B3000FACD0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 39 | C32E370F1FC663B3000FACD0 /* TransformersTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TransformersTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 40 | C32E37161FC663B3000FACD0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 41 | C32E372C1FC67E9D000FACD0 /* Transformers.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Transformers.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | C32E372E1FC67E9D000FACD0 /* Transformers_tvOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Transformers_tvOS.h; sourceTree = ""; }; 43 | C32E372F1FC67E9D000FACD0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 44 | C32E37481FC67F20000FACD0 /* Transformers.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Transformers.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 45 | C32E374A1FC67F20000FACD0 /* Transformers_macOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = Transformers_macOS.h; sourceTree = ""; }; 46 | C32E374B1FC67F20000FACD0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 47 | C35FC60A207F2ED900E6C36B /* Dictionary+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Dictionary+Extensions.swift"; sourceTree = ""; }; 48 | C35FC60B207F2ED900E6C36B /* Data+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Data+Extensions.swift"; sourceTree = ""; }; 49 | C35FC612207F309000E6C36B /* DictionaryExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DictionaryExtensionTests.swift; sourceTree = ""; }; 50 | /* End PBXFileReference section */ 51 | 52 | /* Begin PBXFrameworksBuildPhase section */ 53 | C32E37021FC663B3000FACD0 /* Frameworks */ = { 54 | isa = PBXFrameworksBuildPhase; 55 | buildActionMask = 2147483647; 56 | files = ( 57 | ); 58 | runOnlyForDeploymentPostprocessing = 0; 59 | }; 60 | C32E370C1FC663B3000FACD0 /* Frameworks */ = { 61 | isa = PBXFrameworksBuildPhase; 62 | buildActionMask = 2147483647; 63 | files = ( 64 | C32E37101FC663B3000FACD0 /* Transformers.framework in Frameworks */, 65 | ); 66 | runOnlyForDeploymentPostprocessing = 0; 67 | }; 68 | C32E37281FC67E9D000FACD0 /* Frameworks */ = { 69 | isa = PBXFrameworksBuildPhase; 70 | buildActionMask = 2147483647; 71 | files = ( 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | C32E37441FC67F20000FACD0 /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | ); 80 | runOnlyForDeploymentPostprocessing = 0; 81 | }; 82 | /* End PBXFrameworksBuildPhase section */ 83 | 84 | /* Begin PBXGroup section */ 85 | C316766C207E06CA005E8858 /* Sources */ = { 86 | isa = PBXGroup; 87 | children = ( 88 | C35FC609207F2ED900E6C36B /* Transformers */, 89 | ); 90 | path = Sources; 91 | sourceTree = ""; 92 | }; 93 | C32E36FC1FC663B3000FACD0 = { 94 | isa = PBXGroup; 95 | children = ( 96 | C316766C207E06CA005E8858 /* Sources */, 97 | C32E37081FC663B3000FACD0 /* Transformers */, 98 | C32E37131FC663B3000FACD0 /* TransformersTests */, 99 | C32E372D1FC67E9D000FACD0 /* Transformers-tvOS */, 100 | C32E37491FC67F20000FACD0 /* Transformers-macOS */, 101 | C32E37071FC663B3000FACD0 /* Products */, 102 | ); 103 | sourceTree = ""; 104 | }; 105 | C32E37071FC663B3000FACD0 /* Products */ = { 106 | isa = PBXGroup; 107 | children = ( 108 | C32E37061FC663B3000FACD0 /* Transformers.framework */, 109 | C32E370F1FC663B3000FACD0 /* TransformersTests.xctest */, 110 | C32E372C1FC67E9D000FACD0 /* Transformers.framework */, 111 | C32E37481FC67F20000FACD0 /* Transformers.framework */, 112 | ); 113 | name = Products; 114 | sourceTree = ""; 115 | }; 116 | C32E37081FC663B3000FACD0 /* Transformers */ = { 117 | isa = PBXGroup; 118 | children = ( 119 | C32E37091FC663B3000FACD0 /* Transformers.h */, 120 | C32E370A1FC663B3000FACD0 /* Info.plist */, 121 | ); 122 | path = Transformers; 123 | sourceTree = ""; 124 | }; 125 | C32E37131FC663B3000FACD0 /* TransformersTests */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | C316767E207E10AF005E8858 /* DataExtensionTests.swift */, 129 | C32E37161FC663B3000FACD0 /* Info.plist */, 130 | C35FC612207F309000E6C36B /* DictionaryExtensionTests.swift */, 131 | ); 132 | path = TransformersTests; 133 | sourceTree = ""; 134 | }; 135 | C32E372D1FC67E9D000FACD0 /* Transformers-tvOS */ = { 136 | isa = PBXGroup; 137 | children = ( 138 | C32E372E1FC67E9D000FACD0 /* Transformers_tvOS.h */, 139 | C32E372F1FC67E9D000FACD0 /* Info.plist */, 140 | ); 141 | path = "Transformers-tvOS"; 142 | sourceTree = ""; 143 | }; 144 | C32E37491FC67F20000FACD0 /* Transformers-macOS */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | C32E374A1FC67F20000FACD0 /* Transformers_macOS.h */, 148 | C32E374B1FC67F20000FACD0 /* Info.plist */, 149 | ); 150 | path = "Transformers-macOS"; 151 | sourceTree = ""; 152 | }; 153 | C35FC609207F2ED900E6C36B /* Transformers */ = { 154 | isa = PBXGroup; 155 | children = ( 156 | C35FC60A207F2ED900E6C36B /* Dictionary+Extensions.swift */, 157 | C35FC60B207F2ED900E6C36B /* Data+Extensions.swift */, 158 | ); 159 | path = Transformers; 160 | sourceTree = ""; 161 | }; 162 | /* End PBXGroup section */ 163 | 164 | /* Begin PBXHeadersBuildPhase section */ 165 | C32E37031FC663B3000FACD0 /* Headers */ = { 166 | isa = PBXHeadersBuildPhase; 167 | buildActionMask = 2147483647; 168 | files = ( 169 | C32E37171FC663B3000FACD0 /* Transformers.h in Headers */, 170 | ); 171 | runOnlyForDeploymentPostprocessing = 0; 172 | }; 173 | C32E37291FC67E9D000FACD0 /* Headers */ = { 174 | isa = PBXHeadersBuildPhase; 175 | buildActionMask = 2147483647; 176 | files = ( 177 | C32E373C1FC67E9E000FACD0 /* Transformers_tvOS.h in Headers */, 178 | ); 179 | runOnlyForDeploymentPostprocessing = 0; 180 | }; 181 | C32E37451FC67F20000FACD0 /* Headers */ = { 182 | isa = PBXHeadersBuildPhase; 183 | buildActionMask = 2147483647; 184 | files = ( 185 | C32E374C1FC67F20000FACD0 /* Transformers_macOS.h in Headers */, 186 | ); 187 | runOnlyForDeploymentPostprocessing = 0; 188 | }; 189 | /* End PBXHeadersBuildPhase section */ 190 | 191 | /* Begin PBXNativeTarget section */ 192 | C32E37051FC663B3000FACD0 /* Transformers-iOS */ = { 193 | isa = PBXNativeTarget; 194 | buildConfigurationList = C32E371A1FC663B3000FACD0 /* Build configuration list for PBXNativeTarget "Transformers-iOS" */; 195 | buildPhases = ( 196 | C32E37011FC663B3000FACD0 /* Sources */, 197 | C32E37021FC663B3000FACD0 /* Frameworks */, 198 | C32E37031FC663B3000FACD0 /* Headers */, 199 | C32E37041FC663B3000FACD0 /* Resources */, 200 | ); 201 | buildRules = ( 202 | ); 203 | dependencies = ( 204 | ); 205 | name = "Transformers-iOS"; 206 | productName = Transformers; 207 | productReference = C32E37061FC663B3000FACD0 /* Transformers.framework */; 208 | productType = "com.apple.product-type.framework"; 209 | }; 210 | C32E370E1FC663B3000FACD0 /* TransformersTests */ = { 211 | isa = PBXNativeTarget; 212 | buildConfigurationList = C32E371D1FC663B3000FACD0 /* Build configuration list for PBXNativeTarget "TransformersTests" */; 213 | buildPhases = ( 214 | C32E370B1FC663B3000FACD0 /* Sources */, 215 | C32E370C1FC663B3000FACD0 /* Frameworks */, 216 | C32E370D1FC663B3000FACD0 /* Resources */, 217 | ); 218 | buildRules = ( 219 | ); 220 | dependencies = ( 221 | C32E37121FC663B3000FACD0 /* PBXTargetDependency */, 222 | ); 223 | name = TransformersTests; 224 | productName = TransformersTests; 225 | productReference = C32E370F1FC663B3000FACD0 /* TransformersTests.xctest */; 226 | productType = "com.apple.product-type.bundle.unit-test"; 227 | }; 228 | C32E372B1FC67E9D000FACD0 /* Transformers-tvOS */ = { 229 | isa = PBXNativeTarget; 230 | buildConfigurationList = C32E373D1FC67E9E000FACD0 /* Build configuration list for PBXNativeTarget "Transformers-tvOS" */; 231 | buildPhases = ( 232 | C32E37271FC67E9D000FACD0 /* Sources */, 233 | C32E37281FC67E9D000FACD0 /* Frameworks */, 234 | C32E37291FC67E9D000FACD0 /* Headers */, 235 | C32E372A1FC67E9D000FACD0 /* Resources */, 236 | ); 237 | buildRules = ( 238 | ); 239 | dependencies = ( 240 | ); 241 | name = "Transformers-tvOS"; 242 | productName = "Transformers-tvOS"; 243 | productReference = C32E372C1FC67E9D000FACD0 /* Transformers.framework */; 244 | productType = "com.apple.product-type.framework"; 245 | }; 246 | C32E37471FC67F20000FACD0 /* Transformers-macOS */ = { 247 | isa = PBXNativeTarget; 248 | buildConfigurationList = C32E374D1FC67F21000FACD0 /* Build configuration list for PBXNativeTarget "Transformers-macOS" */; 249 | buildPhases = ( 250 | C32E37431FC67F20000FACD0 /* Sources */, 251 | C32E37441FC67F20000FACD0 /* Frameworks */, 252 | C32E37451FC67F20000FACD0 /* Headers */, 253 | C32E37461FC67F20000FACD0 /* Resources */, 254 | ); 255 | buildRules = ( 256 | ); 257 | dependencies = ( 258 | ); 259 | name = "Transformers-macOS"; 260 | productName = "Transformers-macOS"; 261 | productReference = C32E37481FC67F20000FACD0 /* Transformers.framework */; 262 | productType = "com.apple.product-type.framework"; 263 | }; 264 | /* End PBXNativeTarget section */ 265 | 266 | /* Begin PBXProject section */ 267 | C32E36FD1FC663B3000FACD0 /* Project object */ = { 268 | isa = PBXProject; 269 | attributes = { 270 | LastSwiftUpdateCheck = 0910; 271 | LastUpgradeCheck = 0930; 272 | ORGANIZATIONNAME = nswebfrog; 273 | TargetAttributes = { 274 | C32E37051FC663B3000FACD0 = { 275 | CreatedOnToolsVersion = 9.1; 276 | LastSwiftMigration = 0910; 277 | ProvisioningStyle = Manual; 278 | }; 279 | C32E370E1FC663B3000FACD0 = { 280 | CreatedOnToolsVersion = 9.1; 281 | ProvisioningStyle = Automatic; 282 | }; 283 | C32E372B1FC67E9D000FACD0 = { 284 | CreatedOnToolsVersion = 9.1; 285 | ProvisioningStyle = Manual; 286 | }; 287 | C32E37471FC67F20000FACD0 = { 288 | CreatedOnToolsVersion = 9.1; 289 | ProvisioningStyle = Manual; 290 | }; 291 | }; 292 | }; 293 | buildConfigurationList = C32E37001FC663B3000FACD0 /* Build configuration list for PBXProject "Transformers" */; 294 | compatibilityVersion = "Xcode 8.0"; 295 | developmentRegion = en; 296 | hasScannedForEncodings = 0; 297 | knownRegions = ( 298 | en, 299 | ); 300 | mainGroup = C32E36FC1FC663B3000FACD0; 301 | productRefGroup = C32E37071FC663B3000FACD0 /* Products */; 302 | projectDirPath = ""; 303 | projectRoot = ""; 304 | targets = ( 305 | C32E37051FC663B3000FACD0 /* Transformers-iOS */, 306 | C32E370E1FC663B3000FACD0 /* TransformersTests */, 307 | C32E372B1FC67E9D000FACD0 /* Transformers-tvOS */, 308 | C32E37471FC67F20000FACD0 /* Transformers-macOS */, 309 | ); 310 | }; 311 | /* End PBXProject section */ 312 | 313 | /* Begin PBXResourcesBuildPhase section */ 314 | C32E37041FC663B3000FACD0 /* Resources */ = { 315 | isa = PBXResourcesBuildPhase; 316 | buildActionMask = 2147483647; 317 | files = ( 318 | ); 319 | runOnlyForDeploymentPostprocessing = 0; 320 | }; 321 | C32E370D1FC663B3000FACD0 /* Resources */ = { 322 | isa = PBXResourcesBuildPhase; 323 | buildActionMask = 2147483647; 324 | files = ( 325 | ); 326 | runOnlyForDeploymentPostprocessing = 0; 327 | }; 328 | C32E372A1FC67E9D000FACD0 /* Resources */ = { 329 | isa = PBXResourcesBuildPhase; 330 | buildActionMask = 2147483647; 331 | files = ( 332 | ); 333 | runOnlyForDeploymentPostprocessing = 0; 334 | }; 335 | C32E37461FC67F20000FACD0 /* Resources */ = { 336 | isa = PBXResourcesBuildPhase; 337 | buildActionMask = 2147483647; 338 | files = ( 339 | ); 340 | runOnlyForDeploymentPostprocessing = 0; 341 | }; 342 | /* End PBXResourcesBuildPhase section */ 343 | 344 | /* Begin PBXSourcesBuildPhase section */ 345 | C32E37011FC663B3000FACD0 /* Sources */ = { 346 | isa = PBXSourcesBuildPhase; 347 | buildActionMask = 2147483647; 348 | files = ( 349 | C35FC60C207F2ED900E6C36B /* Dictionary+Extensions.swift in Sources */, 350 | C35FC60F207F2ED900E6C36B /* Data+Extensions.swift in Sources */, 351 | ); 352 | runOnlyForDeploymentPostprocessing = 0; 353 | }; 354 | C32E370B1FC663B3000FACD0 /* Sources */ = { 355 | isa = PBXSourcesBuildPhase; 356 | buildActionMask = 2147483647; 357 | files = ( 358 | C316767F207E10AF005E8858 /* DataExtensionTests.swift in Sources */, 359 | C35FC613207F309000E6C36B /* DictionaryExtensionTests.swift in Sources */, 360 | ); 361 | runOnlyForDeploymentPostprocessing = 0; 362 | }; 363 | C32E37271FC67E9D000FACD0 /* Sources */ = { 364 | isa = PBXSourcesBuildPhase; 365 | buildActionMask = 2147483647; 366 | files = ( 367 | C35FC60D207F2ED900E6C36B /* Dictionary+Extensions.swift in Sources */, 368 | C35FC610207F2ED900E6C36B /* Data+Extensions.swift in Sources */, 369 | ); 370 | runOnlyForDeploymentPostprocessing = 0; 371 | }; 372 | C32E37431FC67F20000FACD0 /* Sources */ = { 373 | isa = PBXSourcesBuildPhase; 374 | buildActionMask = 2147483647; 375 | files = ( 376 | C35FC60E207F2ED900E6C36B /* Dictionary+Extensions.swift in Sources */, 377 | C35FC611207F2ED900E6C36B /* Data+Extensions.swift in Sources */, 378 | ); 379 | runOnlyForDeploymentPostprocessing = 0; 380 | }; 381 | /* End PBXSourcesBuildPhase section */ 382 | 383 | /* Begin PBXTargetDependency section */ 384 | C32E37121FC663B3000FACD0 /* PBXTargetDependency */ = { 385 | isa = PBXTargetDependency; 386 | target = C32E37051FC663B3000FACD0 /* Transformers-iOS */; 387 | targetProxy = C32E37111FC663B3000FACD0 /* PBXContainerItemProxy */; 388 | }; 389 | /* End PBXTargetDependency section */ 390 | 391 | /* Begin XCBuildConfiguration section */ 392 | C32E37181FC663B3000FACD0 /* Debug */ = { 393 | isa = XCBuildConfiguration; 394 | buildSettings = { 395 | ALWAYS_SEARCH_USER_PATHS = NO; 396 | CLANG_ANALYZER_NONNULL = YES; 397 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 398 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 399 | CLANG_CXX_LIBRARY = "libc++"; 400 | CLANG_ENABLE_MODULES = YES; 401 | CLANG_ENABLE_OBJC_ARC = YES; 402 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 403 | CLANG_WARN_BOOL_CONVERSION = YES; 404 | CLANG_WARN_COMMA = YES; 405 | CLANG_WARN_CONSTANT_CONVERSION = YES; 406 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 407 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 408 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 409 | CLANG_WARN_EMPTY_BODY = YES; 410 | CLANG_WARN_ENUM_CONVERSION = YES; 411 | CLANG_WARN_INFINITE_RECURSION = YES; 412 | CLANG_WARN_INT_CONVERSION = YES; 413 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 414 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 415 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 416 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 417 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 418 | CLANG_WARN_STRICT_PROTOTYPES = YES; 419 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 420 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 421 | CLANG_WARN_UNREACHABLE_CODE = YES; 422 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 423 | CODE_SIGN_IDENTITY = "iPhone Developer"; 424 | COPY_PHASE_STRIP = NO; 425 | CURRENT_PROJECT_VERSION = 1; 426 | DEBUG_INFORMATION_FORMAT = dwarf; 427 | ENABLE_STRICT_OBJC_MSGSEND = YES; 428 | ENABLE_TESTABILITY = YES; 429 | GCC_C_LANGUAGE_STANDARD = gnu11; 430 | GCC_DYNAMIC_NO_PIC = NO; 431 | GCC_NO_COMMON_BLOCKS = YES; 432 | GCC_OPTIMIZATION_LEVEL = 0; 433 | GCC_PREPROCESSOR_DEFINITIONS = ( 434 | "DEBUG=1", 435 | "$(inherited)", 436 | ); 437 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 438 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 439 | GCC_WARN_UNDECLARED_SELECTOR = YES; 440 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 441 | GCC_WARN_UNUSED_FUNCTION = YES; 442 | GCC_WARN_UNUSED_VARIABLE = YES; 443 | IPHONEOS_DEPLOYMENT_TARGET = 11.1; 444 | MTL_ENABLE_DEBUG_INFO = YES; 445 | ONLY_ACTIVE_ARCH = YES; 446 | SDKROOT = iphoneos; 447 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 448 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 449 | VERSIONING_SYSTEM = "apple-generic"; 450 | VERSION_INFO_PREFIX = ""; 451 | }; 452 | name = Debug; 453 | }; 454 | C32E37191FC663B3000FACD0 /* Release */ = { 455 | isa = XCBuildConfiguration; 456 | buildSettings = { 457 | ALWAYS_SEARCH_USER_PATHS = NO; 458 | CLANG_ANALYZER_NONNULL = YES; 459 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 460 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 461 | CLANG_CXX_LIBRARY = "libc++"; 462 | CLANG_ENABLE_MODULES = YES; 463 | CLANG_ENABLE_OBJC_ARC = YES; 464 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 465 | CLANG_WARN_BOOL_CONVERSION = YES; 466 | CLANG_WARN_COMMA = YES; 467 | CLANG_WARN_CONSTANT_CONVERSION = YES; 468 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 469 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 470 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 471 | CLANG_WARN_EMPTY_BODY = YES; 472 | CLANG_WARN_ENUM_CONVERSION = YES; 473 | CLANG_WARN_INFINITE_RECURSION = YES; 474 | CLANG_WARN_INT_CONVERSION = YES; 475 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 476 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 477 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 478 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 479 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 480 | CLANG_WARN_STRICT_PROTOTYPES = YES; 481 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 482 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 483 | CLANG_WARN_UNREACHABLE_CODE = YES; 484 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 485 | CODE_SIGN_IDENTITY = "iPhone Developer"; 486 | COPY_PHASE_STRIP = NO; 487 | CURRENT_PROJECT_VERSION = 1; 488 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 489 | ENABLE_NS_ASSERTIONS = NO; 490 | ENABLE_STRICT_OBJC_MSGSEND = YES; 491 | GCC_C_LANGUAGE_STANDARD = gnu11; 492 | GCC_NO_COMMON_BLOCKS = YES; 493 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 494 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 495 | GCC_WARN_UNDECLARED_SELECTOR = YES; 496 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 497 | GCC_WARN_UNUSED_FUNCTION = YES; 498 | GCC_WARN_UNUSED_VARIABLE = YES; 499 | IPHONEOS_DEPLOYMENT_TARGET = 11.1; 500 | MTL_ENABLE_DEBUG_INFO = NO; 501 | SDKROOT = iphoneos; 502 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 503 | VALIDATE_PRODUCT = YES; 504 | VERSIONING_SYSTEM = "apple-generic"; 505 | VERSION_INFO_PREFIX = ""; 506 | }; 507 | name = Release; 508 | }; 509 | C32E371B1FC663B3000FACD0 /* Debug */ = { 510 | isa = XCBuildConfiguration; 511 | buildSettings = { 512 | CLANG_ENABLE_MODULES = YES; 513 | CODE_SIGN_IDENTITY = ""; 514 | CODE_SIGN_STYLE = Manual; 515 | DEFINES_MODULE = YES; 516 | DEVELOPMENT_TEAM = ""; 517 | DYLIB_COMPATIBILITY_VERSION = 1; 518 | DYLIB_CURRENT_VERSION = 1; 519 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 520 | INFOPLIST_FILE = Transformers/Info.plist; 521 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 522 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 523 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 524 | PRODUCT_BUNDLE_IDENTIFIER = com.nswebfrog.Transformers; 525 | PRODUCT_NAME = Transformers; 526 | PROVISIONING_PROFILE_SPECIFIER = ""; 527 | SDKROOT = iphoneos; 528 | SKIP_INSTALL = YES; 529 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 530 | SWIFT_VERSION = 4.0; 531 | TARGETED_DEVICE_FAMILY = "1,2"; 532 | }; 533 | name = Debug; 534 | }; 535 | C32E371C1FC663B3000FACD0 /* Release */ = { 536 | isa = XCBuildConfiguration; 537 | buildSettings = { 538 | CLANG_ENABLE_MODULES = YES; 539 | CODE_SIGN_IDENTITY = ""; 540 | CODE_SIGN_STYLE = Manual; 541 | DEFINES_MODULE = YES; 542 | DEVELOPMENT_TEAM = ""; 543 | DYLIB_COMPATIBILITY_VERSION = 1; 544 | DYLIB_CURRENT_VERSION = 1; 545 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 546 | INFOPLIST_FILE = Transformers/Info.plist; 547 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 548 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 549 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 550 | PRODUCT_BUNDLE_IDENTIFIER = com.nswebfrog.Transformers; 551 | PRODUCT_NAME = Transformers; 552 | PROVISIONING_PROFILE_SPECIFIER = ""; 553 | SDKROOT = iphoneos; 554 | SKIP_INSTALL = YES; 555 | SWIFT_VERSION = 4.0; 556 | TARGETED_DEVICE_FAMILY = "1,2"; 557 | }; 558 | name = Release; 559 | }; 560 | C32E371E1FC663B3000FACD0 /* Debug */ = { 561 | isa = XCBuildConfiguration; 562 | buildSettings = { 563 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 564 | CODE_SIGN_STYLE = Automatic; 565 | INFOPLIST_FILE = TransformersTests/Info.plist; 566 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 567 | PRODUCT_BUNDLE_IDENTIFIER = com.nswebfrog.TransformersTests; 568 | PRODUCT_NAME = "$(TARGET_NAME)"; 569 | SWIFT_VERSION = 4.0; 570 | TARGETED_DEVICE_FAMILY = "1,2"; 571 | }; 572 | name = Debug; 573 | }; 574 | C32E371F1FC663B3000FACD0 /* Release */ = { 575 | isa = XCBuildConfiguration; 576 | buildSettings = { 577 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; 578 | CODE_SIGN_STYLE = Automatic; 579 | INFOPLIST_FILE = TransformersTests/Info.plist; 580 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 581 | PRODUCT_BUNDLE_IDENTIFIER = com.nswebfrog.TransformersTests; 582 | PRODUCT_NAME = "$(TARGET_NAME)"; 583 | SWIFT_VERSION = 4.0; 584 | TARGETED_DEVICE_FAMILY = "1,2"; 585 | }; 586 | name = Release; 587 | }; 588 | C32E373E1FC67E9E000FACD0 /* Debug */ = { 589 | isa = XCBuildConfiguration; 590 | buildSettings = { 591 | CODE_SIGN_IDENTITY = ""; 592 | CODE_SIGN_STYLE = Manual; 593 | DEFINES_MODULE = YES; 594 | DEVELOPMENT_TEAM = ""; 595 | DYLIB_COMPATIBILITY_VERSION = 1; 596 | DYLIB_CURRENT_VERSION = 1; 597 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 598 | INFOPLIST_FILE = "Transformers-tvOS/Info.plist"; 599 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 600 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 601 | PRODUCT_BUNDLE_IDENTIFIER = "com.nswebfrog.Transformers-tvOS"; 602 | PRODUCT_NAME = Transformers; 603 | PROVISIONING_PROFILE_SPECIFIER = ""; 604 | SDKROOT = appletvos; 605 | SKIP_INSTALL = YES; 606 | SWIFT_VERSION = 4.0; 607 | TARGETED_DEVICE_FAMILY = 3; 608 | TVOS_DEPLOYMENT_TARGET = 9.0; 609 | }; 610 | name = Debug; 611 | }; 612 | C32E373F1FC67E9E000FACD0 /* Release */ = { 613 | isa = XCBuildConfiguration; 614 | buildSettings = { 615 | CODE_SIGN_IDENTITY = ""; 616 | CODE_SIGN_STYLE = Manual; 617 | DEFINES_MODULE = YES; 618 | DEVELOPMENT_TEAM = ""; 619 | DYLIB_COMPATIBILITY_VERSION = 1; 620 | DYLIB_CURRENT_VERSION = 1; 621 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 622 | INFOPLIST_FILE = "Transformers-tvOS/Info.plist"; 623 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 624 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 625 | PRODUCT_BUNDLE_IDENTIFIER = "com.nswebfrog.Transformers-tvOS"; 626 | PRODUCT_NAME = Transformers; 627 | PROVISIONING_PROFILE_SPECIFIER = ""; 628 | SDKROOT = appletvos; 629 | SKIP_INSTALL = YES; 630 | SWIFT_VERSION = 4.0; 631 | TARGETED_DEVICE_FAMILY = 3; 632 | TVOS_DEPLOYMENT_TARGET = 9.0; 633 | }; 634 | name = Release; 635 | }; 636 | C32E374E1FC67F21000FACD0 /* Debug */ = { 637 | isa = XCBuildConfiguration; 638 | buildSettings = { 639 | CODE_SIGN_IDENTITY = "-"; 640 | CODE_SIGN_STYLE = Manual; 641 | COMBINE_HIDPI_IMAGES = YES; 642 | DEFINES_MODULE = YES; 643 | DEVELOPMENT_TEAM = ""; 644 | DYLIB_COMPATIBILITY_VERSION = 1; 645 | DYLIB_CURRENT_VERSION = 1; 646 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 647 | FRAMEWORK_VERSION = A; 648 | INFOPLIST_FILE = "Transformers-macOS/Info.plist"; 649 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 650 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 651 | MACOSX_DEPLOYMENT_TARGET = 10.9; 652 | PRODUCT_BUNDLE_IDENTIFIER = "com.nswebfrog.Transformers-macOS"; 653 | PRODUCT_NAME = Transformers; 654 | PROVISIONING_PROFILE_SPECIFIER = ""; 655 | SDKROOT = macosx; 656 | SKIP_INSTALL = YES; 657 | SWIFT_VERSION = 4.0; 658 | }; 659 | name = Debug; 660 | }; 661 | C32E374F1FC67F21000FACD0 /* Release */ = { 662 | isa = XCBuildConfiguration; 663 | buildSettings = { 664 | CODE_SIGN_IDENTITY = "-"; 665 | CODE_SIGN_STYLE = Manual; 666 | COMBINE_HIDPI_IMAGES = YES; 667 | DEFINES_MODULE = YES; 668 | DEVELOPMENT_TEAM = ""; 669 | DYLIB_COMPATIBILITY_VERSION = 1; 670 | DYLIB_CURRENT_VERSION = 1; 671 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 672 | FRAMEWORK_VERSION = A; 673 | INFOPLIST_FILE = "Transformers-macOS/Info.plist"; 674 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 675 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; 676 | MACOSX_DEPLOYMENT_TARGET = 10.9; 677 | PRODUCT_BUNDLE_IDENTIFIER = "com.nswebfrog.Transformers-macOS"; 678 | PRODUCT_NAME = Transformers; 679 | PROVISIONING_PROFILE_SPECIFIER = ""; 680 | SDKROOT = macosx; 681 | SKIP_INSTALL = YES; 682 | SWIFT_VERSION = 4.0; 683 | }; 684 | name = Release; 685 | }; 686 | /* End XCBuildConfiguration section */ 687 | 688 | /* Begin XCConfigurationList section */ 689 | C32E37001FC663B3000FACD0 /* Build configuration list for PBXProject "Transformers" */ = { 690 | isa = XCConfigurationList; 691 | buildConfigurations = ( 692 | C32E37181FC663B3000FACD0 /* Debug */, 693 | C32E37191FC663B3000FACD0 /* Release */, 694 | ); 695 | defaultConfigurationIsVisible = 0; 696 | defaultConfigurationName = Release; 697 | }; 698 | C32E371A1FC663B3000FACD0 /* Build configuration list for PBXNativeTarget "Transformers-iOS" */ = { 699 | isa = XCConfigurationList; 700 | buildConfigurations = ( 701 | C32E371B1FC663B3000FACD0 /* Debug */, 702 | C32E371C1FC663B3000FACD0 /* Release */, 703 | ); 704 | defaultConfigurationIsVisible = 0; 705 | defaultConfigurationName = Release; 706 | }; 707 | C32E371D1FC663B3000FACD0 /* Build configuration list for PBXNativeTarget "TransformersTests" */ = { 708 | isa = XCConfigurationList; 709 | buildConfigurations = ( 710 | C32E371E1FC663B3000FACD0 /* Debug */, 711 | C32E371F1FC663B3000FACD0 /* Release */, 712 | ); 713 | defaultConfigurationIsVisible = 0; 714 | defaultConfigurationName = Release; 715 | }; 716 | C32E373D1FC67E9E000FACD0 /* Build configuration list for PBXNativeTarget "Transformers-tvOS" */ = { 717 | isa = XCConfigurationList; 718 | buildConfigurations = ( 719 | C32E373E1FC67E9E000FACD0 /* Debug */, 720 | C32E373F1FC67E9E000FACD0 /* Release */, 721 | ); 722 | defaultConfigurationIsVisible = 0; 723 | defaultConfigurationName = Release; 724 | }; 725 | C32E374D1FC67F21000FACD0 /* Build configuration list for PBXNativeTarget "Transformers-macOS" */ = { 726 | isa = XCConfigurationList; 727 | buildConfigurations = ( 728 | C32E374E1FC67F21000FACD0 /* Debug */, 729 | C32E374F1FC67F21000FACD0 /* Release */, 730 | ); 731 | defaultConfigurationIsVisible = 0; 732 | defaultConfigurationName = Release; 733 | }; 734 | /* End XCConfigurationList section */ 735 | }; 736 | rootObject = C32E36FD1FC663B3000FACD0 /* Project object */; 737 | } 738 | -------------------------------------------------------------------------------- /Transformers.xcodeproj/xcshareddata/xcschemes/Transformers-iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /Transformers.xcodeproj/xcshareddata/xcschemes/Transformers-macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 70 | 71 | 72 | 73 | 75 | 76 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /Transformers.xcodeproj/xcshareddata/xcschemes/Transformers-tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 49 | 50 | 51 | 52 | 53 | 54 | 64 | 65 | 71 | 72 | 73 | 74 | 75 | 76 | 82 | 83 | 89 | 90 | 91 | 92 | 94 | 95 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /Transformers/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /Transformers/Transformers.h: -------------------------------------------------------------------------------- 1 | // 2 | // Transformers.h 3 | // Transformers 4 | // 5 | // Created by Carl Chen on 23/11/2017. 6 | // Copyright © 2017 nswebfrog. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | //! Project version number for Transformers. 12 | FOUNDATION_EXPORT double TransformersVersionNumber; 13 | 14 | //! Project version string for Transformers. 15 | FOUNDATION_EXPORT const unsigned char TransformersVersionString[]; 16 | 17 | // In this header, you should import all the public headers of your framework using statements like #import 18 | 19 | 20 | -------------------------------------------------------------------------------- /TransformersTests/DataExtensionTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DataExtensionTests.swift 3 | // TransformersTests 4 | // 5 | // Created by Carl Chen on 2018/4/11. 6 | // Copyright © 2018 nswebfrog. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import Transformers 11 | 12 | class DataExtensionTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testToDicNotNil() { 25 | let jsonDicStr = """ 26 | { 27 | "k1": "2342", 28 | "k2": 2222, 29 | "k3": "just a test" 30 | } 31 | """ 32 | 33 | let dic = jsonDicStr 34 | .data(using: String.Encoding.utf8) 35 | .flatMap({ $0.toDictionary() }) 36 | 37 | guard let dic2 = dic else { 38 | XCTFail() 39 | return 40 | } 41 | XCTAssert(dic2.count == 3) 42 | 43 | guard let value1 = dic2["k1"] as? String else { 44 | XCTFail() 45 | return 46 | } 47 | XCTAssert(value1 == "2342") 48 | XCTAssert(dic2.value(key: "k1") == "2342") 49 | 50 | guard let value2 = dic2["k2"] as? Int else { 51 | XCTFail() 52 | return 53 | } 54 | XCTAssertEqual(value2, 2222) 55 | XCTAssert(dic2.value(key: "k2") == 2222) 56 | 57 | guard let value3 = dic2["k3"] as? String else { 58 | XCTFail() 59 | return 60 | } 61 | XCTAssertEqual(value3, "just a test") 62 | XCTAssert(dic2.value(key: "k3") == "just a test") 63 | 64 | 65 | } 66 | 67 | func testToDicNil() { 68 | let dic = "[]" 69 | .data(using: String.Encoding.utf8) 70 | .flatMap({ $0.toDictionary() }) 71 | XCTAssertNil(dic) 72 | } 73 | 74 | func testToArrayNotNil() { 75 | let jsonArrayStr = """ 76 | [ 77 | 1, 78 | 2, 79 | 4, 80 | 3 81 | ] 82 | """ 83 | 84 | let array: [Any]? = jsonArrayStr 85 | .data(using: String.Encoding.utf8) 86 | .flatMap({ $0.toArray() }) 87 | XCTAssertNotNil(array) 88 | XCTAssert(array?.count == 4) 89 | 90 | let array2: [Int]? = jsonArrayStr 91 | .data(using: String.Encoding.utf8) 92 | .flatMap({ $0.toArray() }) 93 | XCTAssertNotNil(array2) 94 | XCTAssert(array2?.count == 4) 95 | XCTAssert(array2?[3] == 3) 96 | } 97 | 98 | func testJsonToModel() { 99 | let jsonStr = """ 100 | { 101 | "name": "carl", 102 | "age": 18 103 | } 104 | """ 105 | guard let model: Person = jsonStr.data(using: String.Encoding.utf8) 106 | .flatMap({ $0.jsonToModel() }) else { 107 | XCTFail() 108 | return 109 | } 110 | XCTAssertEqual(model.name, "carl") 111 | XCTAssertEqual(model.age, 18) 112 | 113 | } 114 | 115 | func testJsonToModelArray() { 116 | let jsonStr = """ 117 | [ 118 | { 119 | "name": "carl", 120 | "age": 18 121 | }, 122 | { 123 | "name": "lydia", 124 | "age": 16 125 | } 126 | ] 127 | """ 128 | guard let modelArray: [Person] = jsonStr.data(using: String.Encoding.utf8) 129 | .flatMap({ $0.jsonToModel() }) else { 130 | XCTFail() 131 | return 132 | } 133 | XCTAssertEqual(modelArray.count, 2) 134 | XCTAssertEqual(modelArray[0].name, "carl") 135 | XCTAssertEqual(modelArray[0].age, 18) 136 | XCTAssertEqual(modelArray[1].name, "lydia") 137 | XCTAssertEqual(modelArray[1].age, 16) 138 | 139 | 140 | } 141 | 142 | } 143 | 144 | private struct Person: Codable { 145 | let name: String 146 | let age: Int 147 | } 148 | -------------------------------------------------------------------------------- /TransformersTests/DictionaryExtensionTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DictionaryExtensionTests.swift 3 | // TransformersTests 4 | // 5 | // Created by Carl Chen on 2018/4/12. 6 | // Copyright © 2018 nswebfrog. All rights reserved. 7 | // 8 | 9 | import XCTest 10 | import Transformers 11 | 12 | class DictionaryExtensionTests: XCTestCase { 13 | 14 | override func setUp() { 15 | super.setUp() 16 | // Put setup code here. This method is called before the invocation of each test method in the class. 17 | } 18 | 19 | override func tearDown() { 20 | // Put teardown code here. This method is called after the invocation of each test method in the class. 21 | super.tearDown() 22 | } 23 | 24 | func testKeyPath() { 25 | let jsonDicStr = """ 26 | { 27 | "k1": "2342", 28 | "k2": { 29 | "n1": 22, 30 | "n2": "peter" 31 | }, 32 | "k3": { 33 | "x1": { 34 | "data": "fuck", 35 | "count": 112 36 | }, 37 | "name": "beijing" 38 | } 39 | } 40 | """ 41 | guard let dic = jsonDicStr 42 | .data(using: String.Encoding.utf8) 43 | .flatMap({ $0.toDictionary() }) else { 44 | XCTFail() 45 | return 46 | } 47 | 48 | guard let k1Value: String = dic.value(keyPath: "k1") else { 49 | XCTFail() 50 | return 51 | } 52 | XCTAssertEqual(k1Value, "2342") 53 | 54 | guard let k2Value1: Int = dic.value(keyPath: "k2.n1") else { 55 | XCTFail() 56 | return 57 | } 58 | XCTAssertEqual(k2Value1, 22) 59 | 60 | guard let k3X1Value1: String = dic.value(keyPath: "k3.x1.data") else { 61 | XCTFail() 62 | return 63 | } 64 | XCTAssertEqual(k3X1Value1, "fuck") 65 | 66 | 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /TransformersTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | --------------------------------------------------------------------------------