├── DefaultsKit.png ├── .gitignore ├── DefaultsKit.xcodeproj ├── project.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ ├── WorkspaceSettings.xcsettings │ │ └── IDEWorkspaceChecks.plist ├── xcuserdata │ └── nmdias.xcuserdatad │ │ └── xcschemes │ │ └── xcschememanagement.plist ├── xcshareddata │ └── xcschemes │ │ ├── DefaultsKit iOS.xcscheme │ │ ├── DefaultsKit tvOS.xcscheme │ │ └── DefaultsKit macOS.xcscheme └── project.pbxproj ├── Package.swift ├── DefaultsKit.podspec ├── .github └── workflows │ └── ci.yml ├── Tests ├── Info.plist └── DefaultsKitTests │ ├── Mocks.swift │ ├── DefaultsKey + keys.swift │ └── DefaultsTests.swift ├── Sources ├── Info.plist ├── DefaultsKit.h └── DefaultsKit │ └── Defaults.swift ├── LICENSE ├── INSTALL.md ├── README.zh-CN.md └── README.md /DefaultsKit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nmdias/DefaultsKit/HEAD/DefaultsKit.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | /.build 3 | /Packages 4 | xcuserdata/ 5 | DerivedData/ 6 | .swiftpm/configuration/registries.json 7 | .swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata 8 | .netrc 9 | -------------------------------------------------------------------------------- /DefaultsKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /DefaultsKit.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /DefaultsKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version: 5.4 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: "DefaultsKit", 8 | products: [ 9 | .library( 10 | name: "DefaultsKit", 11 | targets: ["DefaultsKit"] 12 | ), 13 | ], 14 | targets: [ 15 | .target( 16 | name: "DefaultsKit" 17 | ), 18 | .testTarget( 19 | name: "DefaultsKitTests", 20 | dependencies: ["DefaultsKit"] 21 | ), 22 | ] 23 | ) 24 | -------------------------------------------------------------------------------- /DefaultsKit.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'DefaultsKit' 3 | s.version = '0.3.2' 4 | s.license = 'MIT' 5 | s.summary = 'Simple, Strongly Typed UserDefaults for iOS, macOS and tvOS.' 6 | s.homepage = 'https://github.com/nmdias/DefaultsKit' 7 | s.authors = { 'Nuno Manuel Dias' => 'nmdias.pt@gmail.com' } 8 | s.source = { :git => 'https://github.com/nmdias/DefaultsKit.git', :tag => s.version } 9 | s.ios.deployment_target = '12.0' 10 | s.osx.deployment_target = '11.0' 11 | s.tvos.deployment_target = '12.0' 12 | s.watchos.deployment_target = '4.0' 13 | s.source_files = 'Sources/**/*.swift' 14 | s.swift_version = '5.0' 15 | end 16 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a Swift project 2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-swift 3 | 4 | name: CI 5 | 6 | on: 7 | push: 8 | branches: [main] 9 | pull_request: 10 | branches: [main] 11 | 12 | jobs: 13 | build: 14 | runs-on: self-hosted 15 | 16 | steps: 17 | - name: Checkout code 18 | uses: actions/checkout@v4 19 | 20 | - name: Select Xcode 16.0 21 | run: sudo xcode-select -s /Applications/Xcode.app/ 22 | 23 | - name: Build Package 24 | run: swift build 25 | 26 | - name: Run Tests 27 | run: swift test 28 | -------------------------------------------------------------------------------- /Tests/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 | -------------------------------------------------------------------------------- /Sources/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 | 0.0.2 19 | CFBundleVersion 20 | $(CURRENT_PROJECT_VERSION) 21 | NSPrincipalClass 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 - 204 Nuno Manuel Dias 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /DefaultsKit.xcodeproj/xcuserdata/nmdias.xcuserdatad/xcschemes/xcschememanagement.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | SchemeUserState 6 | 7 | DefaultsKit iOS.xcscheme_^#shared#^_ 8 | 9 | orderHint 10 | 0 11 | 12 | DefaultsKit macOS.xcscheme_^#shared#^_ 13 | 14 | orderHint 15 | 1 16 | 17 | DefaultsKit tvOS.xcscheme_^#shared#^_ 18 | 19 | orderHint 20 | 2 21 | 22 | 23 | SuppressBuildableAutocreation 24 | 25 | A0AC4A9F1F43853D0070F91D 26 | 27 | primary 28 | 29 | 30 | A0AC4AA81F43853D0070F91D 31 | 32 | primary 33 | 34 | 35 | A0F0010C1F48D0A600617715 36 | 37 | primary 38 | 39 | 40 | A0F001181F48D0BD00617715 41 | 42 | primary 43 | 44 | 45 | A0F0012B1F48D34200617715 46 | 47 | primary 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /Sources/DefaultsKit.h: -------------------------------------------------------------------------------- 1 | // 2 | // DefaultsKit.h 3 | // 4 | // Copyright (c) 2017 - 2018 Nuno Manuel Dias 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | // 24 | 25 | #import 26 | 27 | //! Project version number for DefaultsKit. 28 | FOUNDATION_EXPORT double DefaultsKitVersionNumber; 29 | 30 | //! Project version string for DefaultsKit. 31 | FOUNDATION_EXPORT const unsigned char DefaultsKitVersionString[]; 32 | 33 | // In this header, you should import all the public headers of your framework using statements like #import 34 | -------------------------------------------------------------------------------- /Tests/DefaultsKitTests/Mocks.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Mocks.swift 3 | // 4 | // Copyright (c) 2017 - 2024 Nuno Manuel Dias 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | // 24 | 25 | import Foundation 26 | 27 | struct PersonMock: Codable, Equatable { 28 | let name: String 29 | let age: Int 30 | let children: [PersonMock] 31 | } 32 | 33 | // MARK: - RawRepresentable 34 | 35 | enum EnumMock: Int, Codable { 36 | case one 37 | case two 38 | case three 39 | } 40 | 41 | struct OptionSetMock: OptionSet, Codable { 42 | let rawValue: Int 43 | static let option1 = OptionSetMock(rawValue: 1) 44 | static let option2 = OptionSetMock(rawValue: 2) 45 | static let option3 = OptionSetMock(rawValue: 3) 46 | } 47 | -------------------------------------------------------------------------------- /Tests/DefaultsKitTests/DefaultsKey + keys.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DefaultsKey + keys.swift 3 | // 4 | // Copyright (c) 2017 - 2024 Nuno Manuel Dias 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | // 24 | 25 | @testable import DefaultsKit 26 | import Foundation 27 | 28 | extension DefaultsKey { 29 | static var integerKey: Key { Key("integerKey") } 30 | static var floatKey: Key { Key("floatKey") } 31 | static var doubleKey: Key { Key("doubleKey") } 32 | static var stringKey: Key { Key("stringKey") } 33 | static var boolKey: Key { Key("boolKey") } 34 | static var dateKey: Key { Key("dateKey") } 35 | static var enumKey: Key { Key("enumKey") } 36 | static var optionSetKey: Key { Key("optionSetKey") } 37 | static var arrayOfIntegersKey: Key<[Int]> { Key("arrayOfIntegersKey") } 38 | static var setOfIntegersKey: Key> { Key("setOfIntegersKey") } 39 | static var personMockKey: Key { Key("personMockKey") } 40 | } 41 | -------------------------------------------------------------------------------- /INSTALL.md: -------------------------------------------------------------------------------- 1 | 2 | # DefaultsKit 3 | 4 | [UserDefaults](https://developer.apple.com/documentation/foundation/userdefaults) for iOS, macOS and tvOS. 5 | 6 | Usage >> [`instructions`](https://github.com/nmdias/DefaultsKit/blob/master/README.md) << 7 | 8 | ## Installation 9 | - [CocoaPods](#cocoapods) 10 | - [Carthage](#carthage) 11 | - [Swift Package Manager](#swift-package-manager) 12 | - [Manually](#manually) 13 | 14 | # 15 | 16 | ### CocoaPods 17 | 18 | [CocoaPods](http://cocoapods.org) is a dependency manager for Swift and Objective-C Cocoa projects. You can install it with the following command: 19 | 20 | ```bash 21 | $ gem install cocoapods 22 | ``` 23 | 24 | To give `DefaultsKit` a try with an example project, run the following command: 25 | 26 | ```bash 27 | $ pod try DefaultsKit 28 | ``` 29 | 30 | To integrate `DefaultsKit` into your Xcode project, specify it in your `Podfile`: 31 | 32 | ```ruby 33 | source 'https://github.com/CocoaPods/Specs.git' 34 | platform :ios, '8.0' 35 | use_frameworks! 36 | 37 | target 'MyApp' do 38 | pod 'DefaultsKit' 39 | end 40 | ``` 41 | 42 | Then, run the following command: 43 | 44 | ```bash 45 | $ pod install 46 | ``` 47 | 48 | ### Carthage 49 | 50 | [Carthage](https://github.com/Carthage/Carthage) is a dependency manager that builds your dependencies and provides you with binary frameworks. 51 | 52 | To install Carthage with [Homebrew](http://brew.sh/) use the following command: 53 | 54 | ```bash 55 | $ brew update 56 | $ brew install carthage 57 | ``` 58 | To integrate DefaultsKit into your Xcode project using Carthage, specify it in your `Cartfile`: 59 | 60 | ```ogdl 61 | github "nmdias/DefaultsKit" 62 | ``` 63 | Build the framework: 64 | 65 | ```bash 66 | $ carthage update 67 | ``` 68 | Then, drag the built `DefaultsKit.framework` into your Xcode project. 69 | 70 | ### Swift Package Manager 71 | 72 | "The [Swift Package Manager](https://swift.org/package-manager/) is a tool for managing the distribution of Swift code. It’s integrated with the Swift build system to automate the process of downloading, compiling, and linking dependencies." 73 | 74 | To integrate `DefaultsKit` into your project, specify it in your `Package.swift` file: 75 | 76 | ```swift 77 | let package = Package( 78 | name: "MyApp", 79 | dependencies: [ 80 | .Package(url: "https://github.com/nmdias/DefaultsKit.git") 81 | ] 82 | ) 83 | ``` 84 | 85 | Then run: 86 | 87 | ```bash 88 | $ swift build 89 | ``` 90 | 91 | Or, alternatively: 92 | 93 | ```bash 94 | $ swift package generate-xcodeproj 95 | ``` 96 | 97 | ### Manually 98 | 99 | Drag `DefaultsKit.xcodeproj` into your Xcode project. 100 | 101 | > It should appear nested underneath your application's blue project icon. 102 | 103 | Click on the `+` button under the "Embedded Binaries" section of your app's target and select the `DefaultsKit.framework` that matches the desired platform. 104 | 105 | ## Credits 106 | Similarities to [Alamofire](https://github.com/Alamofire/Alamofire)'s impecable setup instructions are not a coincidence :) 107 | 108 | ## License 109 | 110 | DefaultsKit is released under the MIT license. See [LICENSE](https://github.com/nmdias/DefaultsKit/blob/master/LICENSE) for details. 111 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /README.zh-CN.md: -------------------------------------------------------------------------------- 1 | 2 | ![DefaultsKit](/DefaultsKit.png?raw=true) 3 | 4 | [![cocoapods compatible](https://img.shields.io/badge/cocoapods-compatible-brightgreen.svg)](https://cocoapods.org/pods/DefaultsKit) 5 | [![carthage compatible](https://img.shields.io/badge/carthage-compatible-brightgreen.svg)](https://github.com/Carthage/Carthage) 6 | [![language](https://img.shields.io/badge/spm-compatible-brightgreen.svg)](https://swift.org) 7 | [![swift](https://img.shields.io/badge/swift-4.2-orange.svg)](https://github.com/nmdias/DefaultsKit/releases) 8 | 9 | [English](README.md) 10 | 11 | 12 | DefaultsKit 是一个利用 **Swift 4** 强大的 [Codable](https://developer.apple.com/documentation/swift/codable),在 [UserDefaults](https://developer.apple.com/documentation/foundation/userdefaults) 基础上提供一层**简单**且**强大**的封装。它仅使用少于 70 行代码来实现这些功能。 13 | 14 | 如何安装 >> [`指南`](https://github.com/nmdias/DefaultsKit/blob/master/INSTALL.md) << 15 | 16 | 17 | ## 使用说明 18 | 19 | 第一步: 实例化或者从 `Defaults` 获取一个 `shared` 实例 20 | 21 | ```swift 22 | let defaults = Defaults() // 或者使用 let defaults = Defaults.shared 23 | ``` 24 | 25 | 第二步: 26 | 27 | ```swift 28 | // 定义一个键 (key) 29 | let key = Key("someKey") 30 | 31 | // 设置值 (value) 32 | defaults.set("Codable FTW 😃", for: key) 33 | 34 | // 通过设置的 key 来查看返回的 value 结果值 35 | defaults.get(for: key) // 输出: Codable FTW 😃 36 | ``` 37 | 38 | ### 判断某个键是否含有某个值 39 | 40 | ```swift 41 | if defaults.has(key) { 42 | // 书写你自己的代码 43 | } 44 | ``` 45 | 46 | > 如果你只需要知道该键值对 (key,value) 是否存在,**而不需要使用该 key 使用的返回值 (value)**,你可以使用 `has()`这个方法代替可选的 `get(for:key)` 方法。对于一些复杂的对象,它可以减少避免一些不必要的反序列化。 47 | 48 | ### 隐式成员表达式 49 | 50 | 通过扩展`DefaultsKey`,你可以方便的包装你的键。这允许你使用[隐式成员表达式](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#//appleref/swift/grammar/implicit-member-expression): 51 | ```swift 52 | // 使用自定义键扩展 53 | extension DefaultsKey { 54 | static let someKey = Key("someKey") 55 | } 56 | 57 | // 然后这样使用 58 | defaults.set("Some key", for: .someKey) 59 | defaults.get(for: .someKey) // 输出: Some key 60 | ``` 61 | 62 | ### 复杂对象 63 | 64 | 存储一个遵循 [Codable](https://developer.apple.com/documentation/swift/codable) 协议的复杂对象: 65 | 66 | ```swift 67 | struct Person: Codable { 68 | let name: String 69 | let age: Int 70 | } 71 | ``` 72 | 73 | 然后: 74 | 75 | ```swift 76 | // 创建一个键 77 | let key = Key("personKey") 78 | 79 | // 获取一个遵循 Codable 协议的枚举,结构体或者类的实例 80 | let person = Person(name: "Bonnie Greenwell", age: 80) 81 | 82 | // 赋值 83 | defaults.set(person, for: key) 84 | ``` 85 | 86 | 最后: 87 | 88 | ```swift 89 | // 查看 key 返回值的 value 90 | let person = defaults.get(for: key) 91 | person?.name // Bonnie Greenwell 92 | person?.age // 80 93 | ``` 94 | ### 嵌套对象的存储 95 | 96 | 只要是遵循 `Codable` 协议的对象,你都可以嵌套地使用它们。 97 | 98 | ```swift 99 | enum Pet: String, Codable { 100 | case cat 101 | case dog 102 | } 103 | 104 | struct Person: Codable { 105 | let name: String 106 | let pets: [Pet] 107 | } 108 | 109 | // 获取一个遵循 Codable 协议的实例 110 | let person = Person(name: "Claire", pets: [.cat]) 111 | 112 | // 赋值 113 | defaults.set(person, for: key) 114 | 115 | // 查看 key 返回值的 value 116 | let person = defaults.get(for: key) 117 | person?.name // Claire 118 | person?.pets.first // cat 119 | ``` 120 | 121 | ## 开源协议 122 | 123 | DefaultsKit 使用 MIT 协议,更多内容可以查看 [LICENSE](https://github.com/nmdias/DefaultsKit/blob/master/LICENSE)。 124 | 125 | ### 寻求帮助 126 | #### [Review/Translate this file to Chinese](https://github.com/nmdias/DefaultsKit/issues/1) 127 | 128 | 汉语是世界上使用人数最多的语言,我希望 DefaultsKit 能被更多的人使用,但是我不会说汉语。如果你会汉语,而且愿意帮忙,请看看 [issue #1](https://github.com/nmdias/DefaultsKit/issues/1)。 129 | 130 | 谢谢 🙏 131 | -------------------------------------------------------------------------------- /DefaultsKit.xcodeproj/xcshareddata/xcschemes/DefaultsKit iOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 42 | 48 | 49 | 50 | 51 | 52 | 62 | 63 | 69 | 70 | 71 | 72 | 78 | 79 | 85 | 86 | 87 | 88 | 90 | 91 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /DefaultsKit.xcodeproj/xcshareddata/xcschemes/DefaultsKit tvOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 42 | 48 | 49 | 50 | 51 | 52 | 62 | 63 | 69 | 70 | 71 | 72 | 78 | 79 | 85 | 86 | 87 | 88 | 90 | 91 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /DefaultsKit.xcodeproj/xcshareddata/xcschemes/DefaultsKit macOS.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 37 | 38 | 39 | 40 | 42 | 48 | 49 | 50 | 51 | 52 | 62 | 63 | 69 | 70 | 71 | 72 | 78 | 79 | 85 | 86 | 87 | 88 | 90 | 91 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![DefaultsKit](/DefaultsKit.png?raw=true) 2 | 3 | [![CI](https://github.com/nmdias/DefaultsKit/actions/workflows/ci.yml/badge.svg)](https://github.com/nmdias/DefaultsKit/actions) 4 | [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fnmdias%2FDefaultsKit%2Fbadge%3Ftype%3Dswift-versions)](https://swiftpackageindex.com/nmdias/DefaultsKit) 5 | [![](https://img.shields.io/endpoint?url=https%3A%2F%2Fswiftpackageindex.com%2Fapi%2Fpackages%2Fnmdias%2FDefaultsKit%2Fbadge%3Ftype%3Dplatforms)](https://swiftpackageindex.com/nmdias/DefaultsKit) 6 | 7 | [![cocoapods compatible](https://img.shields.io/badge/cocoapods-compatible-brightgreen.svg)](https://cocoapods.org/pods/DefaultsKit) 8 | [![carthage compatible](https://img.shields.io/badge/carthage-compatible-brightgreen.svg)](https://github.com/Carthage/Carthage) 9 | 10 | [简体中文](README.zh-CN.md) 11 | 12 | DefaultsKit is a lightweight Swift library that builds on [Codable](https://developer.apple.com/documentation/swift/codable) to offer a **Simple**, **Strongly Typed** and compact wrapper for [UserDefaults](https://developer.apple.com/documentation/foundation/userdefaults). With fewer than 100 lines of code, it’s both easy to use and highly efficient. 13 | 14 | Installation >> [`instructions`](https://github.com/nmdias/DefaultsKit/blob/master/INSTALL.md) << 15 | 16 | ## Usage 17 | 18 | Instantiate, or get a `shared` instance of `Defaults` 19 | 20 | ```swift 21 | let defaults = Defaults() // or Defaults.shared 22 | ``` 23 | 24 | Then: 25 | 26 | ```swift 27 | // Define a key 28 | let key = Key("someKey") 29 | 30 | // Set a value 31 | defaults.set("Codable FTW 😃", for: key) 32 | 33 | // Read the value back 34 | defaults.get(for: key) // Output: Codable FTW 😃 35 | ``` 36 | 37 | ### Check if a key has a value: 38 | 39 | ```swift 40 | if defaults.has(key) { 41 | // Do your thing 42 | } 43 | ``` 44 | 45 | > If you just need to know that a key/value pair exists, **without actually using the value**, use the `has()` method instead of the optional `get(for:key)`. For complex objects it will prevent any unnecessary deserialization. 46 | 47 | ### Implicit Member Expression 48 | 49 | You can find a convenience wrapper for your keys by extending `DefaultsKey`. This allows you use [Implicit Member Expression](https://docs.swift.org/swift-book/ReferenceManual/Expressions.html#//appleref/swift/grammar/implicit-member-expression): 50 | 51 | ```swift 52 | // Extend with a custom key 53 | extension DefaultsKey { 54 | static var someKey: Key { Key("someKey") } 55 | } 56 | 57 | // Then use it like this 58 | defaults.set("Some key", for: .someKey) 59 | defaults.get(for: .someKey) // Output: Some key 60 | ``` 61 | 62 | ### Complex objects 63 | 64 | To store a complex object just conform to the [Codable](https://developer.apple.com/documentation/swift/codable) protocol: 65 | 66 | ```swift 67 | struct Person: Codable { 68 | let name: String 69 | let age: Int 70 | } 71 | ``` 72 | 73 | Then: 74 | 75 | ```swift 76 | // Create a key 77 | let key = Key("personKey") 78 | 79 | // Get an instance of your Codable conforming enum, struct or class 80 | let person = Person(name: "Bonnie Greenwell", age: 80) 81 | 82 | // Set the value 83 | defaults.set(person, for: key) 84 | ``` 85 | 86 | And finally: 87 | 88 | ```swift 89 | // Read it back 90 | let person = defaults.get(for: key) 91 | person?.name // Bonnie Greenwell 92 | person?.age // 80 93 | ``` 94 | 95 | ### Nested Objects 96 | 97 | You can also use nested objects as long as they conform to the `Codable` protocol: 98 | 99 | ```swift 100 | enum Pet: String, Codable { 101 | case cat 102 | case dog 103 | } 104 | 105 | struct Person: Codable { 106 | let name: String 107 | let pets: [Pet] 108 | } 109 | 110 | // Get a Codable conforming instante 111 | let person = Person(name: "Claire", pets: [.cat]) 112 | 113 | // Set the value 114 | defaults.set(person, for: key) 115 | 116 | // And read it back 117 | let person = defaults.get(for: key) 118 | person?.name // Claire 119 | person?.pets.first // cat 120 | ``` 121 | 122 | ## License 123 | 124 | DefaultsKit is released under the MIT license. See [LICENSE](https://github.com/nmdias/DefaultsKit/blob/master/LICENSE) for details. 125 | 126 | ### Help Wanted 127 | 128 | #### Review/Translate [README.zh-CN.md](README.zh-CN.md) to Chinese 129 | 130 | Chinese is the #1 spoken language in the world and I'd love to have DefaultsKit be more inclusive, unfortunately I don't speak Chinese. If you know chinese, and would like to help out, please see [issue #1](https://github.com/nmdias/DefaultsKit/issues/1) 131 | 132 | Thank you 🙏 133 | -------------------------------------------------------------------------------- /Sources/DefaultsKit/Defaults.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Defaults.swift 3 | // 4 | // Copyright (c) 2017 - 204 Nuno Manuel Dias 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | // 24 | 25 | import Foundation 26 | 27 | public protocol DefaultsKey {} 28 | 29 | /// Represents a `Key` with an associated generic value type conforming to the 30 | /// `Codable` protocol. 31 | /// 32 | /// static let someKey = Key("someKey") 33 | public struct Key: DefaultsKey { 34 | fileprivate let _key: String 35 | public init(_ key: String) { 36 | _key = key 37 | } 38 | } 39 | 40 | /// Provides strongly typed values associated with the lifetime 41 | /// of an application. Apropriate for user preferences. 42 | /// - Warning 43 | /// These should not be used to store sensitive information that could compromise 44 | /// the application or the user's security and privacy. 45 | public struct Defaults { 46 | private var userDefaults: UserDefaults 47 | 48 | /// Shared instance of `Defaults`, used for ad-hoc access to the user's 49 | /// defaults database throughout the app. 50 | public static let shared = Defaults() 51 | 52 | /// An instance of `Defaults` with the specified `UserDefaults` instance. 53 | /// 54 | /// - Parameter userDefaults: The UserDefaults. 55 | public init(userDefaults: UserDefaults = UserDefaults.standard) { 56 | self.userDefaults = userDefaults 57 | } 58 | 59 | /// Deletes the value associated with the specified key, if any. 60 | /// 61 | /// - Parameter key: The key. 62 | public func clear(_ key: Key) { 63 | userDefaults.set(nil, forKey: key._key) 64 | userDefaults.synchronize() 65 | } 66 | 67 | /// Checks if there is a value associated with the specified key. 68 | /// 69 | /// - Parameter key: The key to look for. 70 | /// - Returns: A boolean value indicating if a value exists for the specified key. 71 | public func has(_ key: Key) -> Bool { 72 | return userDefaults.value(forKey: key._key) != nil 73 | } 74 | 75 | /// Returns the value associated with the specified key. 76 | /// 77 | /// - Parameter key: The key. 78 | /// - Returns: A `ValueType` or nil if the key was not found. 79 | public func get(for key: Key) -> ValueType? { 80 | if isSwiftCodableType(ValueType.self) || isFoundationCodableType(ValueType.self) { 81 | return userDefaults.value(forKey: key._key) as? ValueType 82 | } 83 | 84 | guard let data = userDefaults.data(forKey: key._key) else { 85 | return nil 86 | } 87 | 88 | do { 89 | let decoder = JSONDecoder() 90 | let decoded = try decoder.decode(ValueType.self, from: data) 91 | return decoded 92 | } catch { 93 | #if DEBUG 94 | print(error) 95 | #endif 96 | } 97 | 98 | return nil 99 | } 100 | 101 | /// Sets a value associated with the specified key. 102 | /// 103 | /// - Parameters: 104 | /// - some: The value to set. 105 | /// - key: The associated `Key`. 106 | public func set(_ value: ValueType, for key: Key) { 107 | if isSwiftCodableType(ValueType.self) || isFoundationCodableType(ValueType.self) { 108 | userDefaults.set(value, forKey: key._key) 109 | return 110 | } 111 | 112 | do { 113 | let encoder = JSONEncoder() 114 | let encoded = try encoder.encode(value) 115 | userDefaults.set(encoded, forKey: key._key) 116 | userDefaults.synchronize() 117 | } catch { 118 | #if DEBUG 119 | print(error) 120 | #endif 121 | } 122 | } 123 | 124 | // MARK: - RawRepresentable 125 | 126 | /// Returns the value associated with the specified key. 127 | /// 128 | /// - Parameter key: The key. 129 | /// - Returns: A `ValueType` or nil if the key was not found. 130 | public func get(for key: Key) -> ValueType? where ValueType.RawValue: Codable { 131 | let convertedKey = Key(key._key) 132 | if let raw = get(for: convertedKey) { 133 | return ValueType(rawValue: raw) 134 | } 135 | return nil 136 | } 137 | 138 | /// Sets a value associated with the specified key. 139 | /// 140 | /// - Parameters: 141 | /// - some: The value to set. 142 | /// - key: The associated `Key`. 143 | public func set(_ value: ValueType, for key: Key) where ValueType.RawValue: Codable { 144 | let convertedKey = Key(key._key) 145 | set(value.rawValue, for: convertedKey) 146 | } 147 | 148 | /// Removes given bundle's persistent domain 149 | /// 150 | /// - Parameter type: Bundle. 151 | public func removeAll(bundle: Bundle = Bundle.main) { 152 | guard let name = bundle.bundleIdentifier else { return } 153 | userDefaults.removePersistentDomain(forName: name) 154 | } 155 | 156 | /// Checks if the specified type is a Codable from the Swift standard library. 157 | /// 158 | /// - Parameter type: The type. 159 | /// - Returns: A boolean value. 160 | private func isSwiftCodableType(_ type: ValueType.Type) -> Bool { 161 | switch type { 162 | case is String.Type, is Bool.Type, is Int.Type, is Float.Type, is Double.Type: 163 | return true 164 | default: 165 | return false 166 | } 167 | } 168 | 169 | /// Checks if the specified type is a Codable, from the Swift's core libraries 170 | /// Foundation framework. 171 | /// 172 | /// - Parameter type: The type. 173 | /// - Returns: A boolean value. 174 | private func isFoundationCodableType(_ type: ValueType.Type) -> Bool { 175 | switch type { 176 | case is Date.Type: 177 | return true 178 | default: 179 | return false 180 | } 181 | } 182 | } 183 | -------------------------------------------------------------------------------- /Tests/DefaultsKitTests/DefaultsTests.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DefaultsTests.swift 3 | // 4 | // Copyright (c) 2017 - 204 Nuno Manuel Dias 5 | // 6 | // Permission is hereby granted, free of charge, to any person obtaining a copy 7 | // of this software and associated documentation files (the "Software"), to deal 8 | // in the Software without restriction, including without limitation the rights 9 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | // copies of the Software, and to permit persons to whom the Software is 11 | // furnished to do so, subject to the following conditions: 12 | // 13 | // The above copyright notice and this permission notice shall be included in all 14 | // copies or substantial portions of the Software. 15 | // 16 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | // SOFTWARE. 23 | // 24 | 25 | @testable import DefaultsKit 26 | 27 | import Foundation 28 | import Testing 29 | 30 | @Suite("DefaultsKit", .serialized) 31 | struct DefaultsKitTests { 32 | @Test func testInteger() { 33 | // Given 34 | let defaults = Defaults() 35 | let expected: Int = 123 36 | 37 | // When 38 | defaults.set(expected, for: .integerKey) 39 | 40 | // Then 41 | let hasKey = defaults.has(.integerKey) 42 | #expect(hasKey) 43 | 44 | let actual = defaults.get(for: .integerKey) 45 | #expect(expected == actual) 46 | } 47 | 48 | @Test func testFloat() { 49 | // Given 50 | let defaults = Defaults() 51 | let expected: Float = 123.1 52 | 53 | // When 54 | defaults.set(expected, for: .floatKey) 55 | 56 | // Then 57 | let hasKey = defaults.has(.floatKey) 58 | #expect(hasKey) 59 | 60 | let actual = defaults.get(for: .floatKey) 61 | #expect(expected == actual) 62 | } 63 | 64 | @Test func testDouble() { 65 | // Given 66 | let defaults = Defaults() 67 | let expected: Double = 123.1 68 | 69 | // When 70 | defaults.set(expected, for: .doubleKey) 71 | 72 | // Then 73 | let hasKey = defaults.has(.doubleKey) 74 | #expect(hasKey) 75 | 76 | let actual = defaults.get(for: .doubleKey) 77 | #expect(expected == actual) 78 | } 79 | 80 | @Test func testString() { 81 | // Given 82 | let defaults = Defaults() 83 | let expected: String = "a string" 84 | 85 | // When 86 | defaults.set(expected, for: .stringKey) 87 | 88 | // Then 89 | let hasKey = defaults.has(.stringKey) 90 | #expect(hasKey) 91 | 92 | let actual = defaults.get(for: .stringKey) 93 | #expect(expected == actual) 94 | } 95 | 96 | @Test func testBool() { 97 | // Given 98 | let defaults = Defaults() 99 | let expected: Bool = true 100 | 101 | // When 102 | defaults.set(expected, for: .boolKey) 103 | 104 | // Then 105 | let hasKey = defaults.has(.boolKey) 106 | #expect(hasKey) 107 | 108 | let actual = defaults.get(for: .boolKey) 109 | #expect(expected == actual) 110 | } 111 | 112 | @Test func testDate() { 113 | // Given 114 | let defaults = Defaults() 115 | let expected: Date = Date() 116 | 117 | // When 118 | defaults.set(expected, for: .dateKey) 119 | 120 | // Then 121 | let hasKey = defaults.has(.dateKey) 122 | #expect(hasKey) 123 | 124 | let actual = defaults.get(for: .dateKey) 125 | #expect(expected == actual) 126 | } 127 | 128 | @Test func testEnum() { 129 | // Given 130 | let defaults = Defaults() 131 | let expected: EnumMock = .three 132 | 133 | // When 134 | defaults.set(expected, for: .enumKey) 135 | 136 | // Then 137 | let hasKey = defaults.has(.enumKey) 138 | #expect(hasKey) 139 | 140 | let actual = defaults.get(for: .enumKey) 141 | #expect(expected == actual) 142 | } 143 | 144 | @Test func testOptionSet() { 145 | // Given 146 | let defaults = Defaults() 147 | let expected: OptionSetMock = .option3 148 | 149 | // When 150 | defaults.set(expected, for: .optionSetKey) 151 | 152 | // Then 153 | let hasKey = defaults.has(.optionSetKey) 154 | #expect(hasKey) 155 | 156 | let actual = defaults.get(for: .optionSetKey) 157 | #expect(expected == actual) 158 | } 159 | 160 | @Test func testSet() { 161 | // Given 162 | let defaults = Defaults() 163 | let expected: Set = [1, 2, 3, 4] 164 | 165 | // When 166 | defaults.set(expected, for: .setOfIntegersKey) 167 | 168 | // Then 169 | let hasKey = defaults.has(.setOfIntegersKey) 170 | #expect(hasKey) 171 | 172 | let actual = defaults.get(for: .setOfIntegersKey) 173 | #expect(expected == actual) 174 | } 175 | 176 | @Test func testClear() { 177 | // Given 178 | let defaults = Defaults() 179 | let integers: [Int] = [1, 2, 3, 4] 180 | let expected: [Int]? = nil 181 | 182 | // When 183 | defaults.set(integers, for: .arrayOfIntegersKey) 184 | 185 | // Then 186 | defaults.clear(.arrayOfIntegersKey) 187 | 188 | let actual = defaults.get(for: .arrayOfIntegersKey) 189 | #expect(expected == actual) 190 | } 191 | 192 | @Test func testSetStruct() { 193 | let defaults = Defaults() 194 | let expected: PersonMock = .init( 195 | name: "Bonnie Greenwell", 196 | age: 80, 197 | children: [ 198 | .init( 199 | name: "Anne Greenwell", 200 | age: 30, 201 | children: [] 202 | ), 203 | ] 204 | ) 205 | 206 | // When 207 | defaults.set(expected, for: .personMockKey) 208 | 209 | // Then 210 | let hasKey = defaults.has(.personMockKey) 211 | #expect(hasKey) 212 | 213 | let actual = defaults.get(for: .personMockKey) 214 | #expect(expected == actual) 215 | } 216 | 217 | @Test 218 | func testThreadUnsafe() async { 219 | // Given 220 | let defaults = Defaults() 221 | let iterations = 10000 222 | 223 | // When 224 | var expected = 0 225 | var actual = 0 226 | 227 | await withTaskGroup(of: Void.self) { taskGroup in 228 | for i in 1 ... iterations { 229 | taskGroup.addTask { 230 | defaults.set(i, for: .integerKey) // Write a value 231 | if let value = defaults.get(for: .integerKey) { 232 | Task.detached { 233 | actual += value 234 | } 235 | } 236 | Task.detached { 237 | expected += i 238 | } 239 | } 240 | } 241 | } 242 | 243 | // Then 244 | #expect(expected != actual) 245 | } 246 | } 247 | -------------------------------------------------------------------------------- /DefaultsKit.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 54; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | A08335B82CEA2453009E4AAF /* DefaultsKey + keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = A08335B42CEA2453009E4AAF /* DefaultsKey + keys.swift */; }; 11 | A08335B92CEA2453009E4AAF /* DefaultsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A08335B52CEA2453009E4AAF /* DefaultsTests.swift */; }; 12 | A08335BA2CEA2453009E4AAF /* Mocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = A08335B62CEA2453009E4AAF /* Mocks.swift */; }; 13 | A08335BB2CEA2453009E4AAF /* DefaultsKey + keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = A08335B42CEA2453009E4AAF /* DefaultsKey + keys.swift */; }; 14 | A08335BC2CEA2453009E4AAF /* DefaultsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A08335B52CEA2453009E4AAF /* DefaultsTests.swift */; }; 15 | A08335BD2CEA2453009E4AAF /* Mocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = A08335B62CEA2453009E4AAF /* Mocks.swift */; }; 16 | A08335BE2CEA2453009E4AAF /* DefaultsKey + keys.swift in Sources */ = {isa = PBXBuildFile; fileRef = A08335B42CEA2453009E4AAF /* DefaultsKey + keys.swift */; }; 17 | A08335BF2CEA2453009E4AAF /* DefaultsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A08335B52CEA2453009E4AAF /* DefaultsTests.swift */; }; 18 | A08335C02CEA2453009E4AAF /* Mocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = A08335B62CEA2453009E4AAF /* Mocks.swift */; }; 19 | A0AC4AAA1F43853D0070F91D /* DefaultsKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A0AC4AA01F43853D0070F91D /* DefaultsKit.framework */; }; 20 | A0AC4AB11F43853D0070F91D /* DefaultsKit.h in Headers */ = {isa = PBXBuildFile; fileRef = A0AC4AA31F43853D0070F91D /* DefaultsKit.h */; settings = {ATTRIBUTES = (Public, ); }; }; 21 | A0AC4ABB1F4385500070F91D /* Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0AC4ABA1F4385500070F91D /* Defaults.swift */; }; 22 | A0F000F61F48CEE500617715 /* Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0AC4ABA1F4385500070F91D /* Defaults.swift */; }; 23 | A0F001041F48CF9D00617715 /* Defaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0AC4ABA1F4385500070F91D /* Defaults.swift */; }; 24 | A0F0011E1F48D0BD00617715 /* DefaultsKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A0F000E91F48CECE00617715 /* DefaultsKit.framework */; }; 25 | A0F001311F48D34200617715 /* DefaultsKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A0F000FC1F48CF8200617715 /* DefaultsKit.framework */; }; 26 | /* End PBXBuildFile section */ 27 | 28 | /* Begin PBXContainerItemProxy section */ 29 | A0AC4AAB1F43853D0070F91D /* PBXContainerItemProxy */ = { 30 | isa = PBXContainerItemProxy; 31 | containerPortal = A0AC4A971F43853D0070F91D /* Project object */; 32 | proxyType = 1; 33 | remoteGlobalIDString = A0AC4A9F1F43853D0070F91D; 34 | remoteInfo = DefaultsKit; 35 | }; 36 | A0F0011F1F48D0BD00617715 /* PBXContainerItemProxy */ = { 37 | isa = PBXContainerItemProxy; 38 | containerPortal = A0AC4A971F43853D0070F91D /* Project object */; 39 | proxyType = 1; 40 | remoteGlobalIDString = A0F000E81F48CECE00617715; 41 | remoteInfo = "DefaultsKit macOS"; 42 | }; 43 | A0F001321F48D34200617715 /* PBXContainerItemProxy */ = { 44 | isa = PBXContainerItemProxy; 45 | containerPortal = A0AC4A971F43853D0070F91D /* Project object */; 46 | proxyType = 1; 47 | remoteGlobalIDString = A0F000FB1F48CF8200617715; 48 | remoteInfo = "DefaultsKit tvOS"; 49 | }; 50 | /* End PBXContainerItemProxy section */ 51 | 52 | /* Begin PBXFileReference section */ 53 | A08335B42CEA2453009E4AAF /* DefaultsKey + keys.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DefaultsKey + keys.swift"; sourceTree = ""; }; 54 | A08335B52CEA2453009E4AAF /* DefaultsTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultsTests.swift; sourceTree = ""; }; 55 | A08335B62CEA2453009E4AAF /* Mocks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mocks.swift; sourceTree = ""; }; 56 | A0AC4AA01F43853D0070F91D /* DefaultsKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DefaultsKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 57 | A0AC4AA31F43853D0070F91D /* DefaultsKit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DefaultsKit.h; sourceTree = ""; }; 58 | A0AC4AA41F43853D0070F91D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 59 | A0AC4AA91F43853D0070F91D /* DefaultsKit iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "DefaultsKit iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 60 | A0AC4AB01F43853D0070F91D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 61 | A0AC4ABA1F4385500070F91D /* Defaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Defaults.swift; sourceTree = ""; }; 62 | A0F000E91F48CECE00617715 /* DefaultsKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DefaultsKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 63 | A0F000FC1F48CF8200617715 /* DefaultsKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = DefaultsKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 64 | A0F001191F48D0BD00617715 /* DefaultsKit macOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "DefaultsKit macOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 65 | A0F0012C1F48D34200617715 /* DefaultsKit tvOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "DefaultsKit tvOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 66 | /* End PBXFileReference section */ 67 | 68 | /* Begin PBXFrameworksBuildPhase section */ 69 | A0AC4A9C1F43853D0070F91D /* Frameworks */ = { 70 | isa = PBXFrameworksBuildPhase; 71 | buildActionMask = 2147483647; 72 | files = ( 73 | ); 74 | runOnlyForDeploymentPostprocessing = 0; 75 | }; 76 | A0AC4AA61F43853D0070F91D /* Frameworks */ = { 77 | isa = PBXFrameworksBuildPhase; 78 | buildActionMask = 2147483647; 79 | files = ( 80 | A0AC4AAA1F43853D0070F91D /* DefaultsKit.framework in Frameworks */, 81 | ); 82 | runOnlyForDeploymentPostprocessing = 0; 83 | }; 84 | A0F000E51F48CECE00617715 /* Frameworks */ = { 85 | isa = PBXFrameworksBuildPhase; 86 | buildActionMask = 2147483647; 87 | files = ( 88 | ); 89 | runOnlyForDeploymentPostprocessing = 0; 90 | }; 91 | A0F000F81F48CF8200617715 /* Frameworks */ = { 92 | isa = PBXFrameworksBuildPhase; 93 | buildActionMask = 2147483647; 94 | files = ( 95 | ); 96 | runOnlyForDeploymentPostprocessing = 0; 97 | }; 98 | A0F001161F48D0BD00617715 /* Frameworks */ = { 99 | isa = PBXFrameworksBuildPhase; 100 | buildActionMask = 2147483647; 101 | files = ( 102 | A0F0011E1F48D0BD00617715 /* DefaultsKit.framework in Frameworks */, 103 | ); 104 | runOnlyForDeploymentPostprocessing = 0; 105 | }; 106 | A0F001291F48D34200617715 /* Frameworks */ = { 107 | isa = PBXFrameworksBuildPhase; 108 | buildActionMask = 2147483647; 109 | files = ( 110 | A0F001311F48D34200617715 /* DefaultsKit.framework in Frameworks */, 111 | ); 112 | runOnlyForDeploymentPostprocessing = 0; 113 | }; 114 | /* End PBXFrameworksBuildPhase section */ 115 | 116 | /* Begin PBXGroup section */ 117 | A08335B22CEA23EB009E4AAF /* DefaultsKit */ = { 118 | isa = PBXGroup; 119 | children = ( 120 | A0AC4ABA1F4385500070F91D /* Defaults.swift */, 121 | ); 122 | path = DefaultsKit; 123 | sourceTree = ""; 124 | }; 125 | A08335B72CEA2453009E4AAF /* DefaultsKitTests */ = { 126 | isa = PBXGroup; 127 | children = ( 128 | A08335B42CEA2453009E4AAF /* DefaultsKey + keys.swift */, 129 | A08335B52CEA2453009E4AAF /* DefaultsTests.swift */, 130 | A08335B62CEA2453009E4AAF /* Mocks.swift */, 131 | ); 132 | path = DefaultsKitTests; 133 | sourceTree = ""; 134 | }; 135 | A0AC4A961F43853D0070F91D = { 136 | isa = PBXGroup; 137 | children = ( 138 | A0AC4AA21F43853D0070F91D /* Sources */, 139 | A0AC4AAD1F43853D0070F91D /* Tests */, 140 | A0AC4AA11F43853D0070F91D /* Products */, 141 | ); 142 | sourceTree = ""; 143 | }; 144 | A0AC4AA11F43853D0070F91D /* Products */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | A0AC4AA01F43853D0070F91D /* DefaultsKit.framework */, 148 | A0AC4AA91F43853D0070F91D /* DefaultsKit iOS Tests.xctest */, 149 | A0F000E91F48CECE00617715 /* DefaultsKit.framework */, 150 | A0F000FC1F48CF8200617715 /* DefaultsKit.framework */, 151 | A0F001191F48D0BD00617715 /* DefaultsKit macOS Tests.xctest */, 152 | A0F0012C1F48D34200617715 /* DefaultsKit tvOS Tests.xctest */, 153 | ); 154 | name = Products; 155 | sourceTree = ""; 156 | }; 157 | A0AC4AA21F43853D0070F91D /* Sources */ = { 158 | isa = PBXGroup; 159 | children = ( 160 | A08335B22CEA23EB009E4AAF /* DefaultsKit */, 161 | A0AC4AA41F43853D0070F91D /* Info.plist */, 162 | A0AC4AA31F43853D0070F91D /* DefaultsKit.h */, 163 | ); 164 | path = Sources; 165 | sourceTree = ""; 166 | }; 167 | A0AC4AAD1F43853D0070F91D /* Tests */ = { 168 | isa = PBXGroup; 169 | children = ( 170 | A08335B72CEA2453009E4AAF /* DefaultsKitTests */, 171 | A0AC4AB01F43853D0070F91D /* Info.plist */, 172 | ); 173 | path = Tests; 174 | sourceTree = ""; 175 | }; 176 | /* End PBXGroup section */ 177 | 178 | /* Begin PBXHeadersBuildPhase section */ 179 | A0AC4A9D1F43853D0070F91D /* Headers */ = { 180 | isa = PBXHeadersBuildPhase; 181 | buildActionMask = 2147483647; 182 | files = ( 183 | A0AC4AB11F43853D0070F91D /* DefaultsKit.h in Headers */, 184 | ); 185 | runOnlyForDeploymentPostprocessing = 0; 186 | }; 187 | A0F000E61F48CECE00617715 /* Headers */ = { 188 | isa = PBXHeadersBuildPhase; 189 | buildActionMask = 2147483647; 190 | files = ( 191 | ); 192 | runOnlyForDeploymentPostprocessing = 0; 193 | }; 194 | A0F000F91F48CF8200617715 /* Headers */ = { 195 | isa = PBXHeadersBuildPhase; 196 | buildActionMask = 2147483647; 197 | files = ( 198 | ); 199 | runOnlyForDeploymentPostprocessing = 0; 200 | }; 201 | /* End PBXHeadersBuildPhase section */ 202 | 203 | /* Begin PBXNativeTarget section */ 204 | A0AC4A9F1F43853D0070F91D /* DefaultsKit iOS */ = { 205 | isa = PBXNativeTarget; 206 | buildConfigurationList = A0AC4AB41F43853D0070F91D /* Build configuration list for PBXNativeTarget "DefaultsKit iOS" */; 207 | buildPhases = ( 208 | A0AC4A9B1F43853D0070F91D /* Sources */, 209 | A0AC4A9C1F43853D0070F91D /* Frameworks */, 210 | A0AC4A9D1F43853D0070F91D /* Headers */, 211 | A0AC4A9E1F43853D0070F91D /* Resources */, 212 | ); 213 | buildRules = ( 214 | ); 215 | dependencies = ( 216 | ); 217 | name = "DefaultsKit iOS"; 218 | productName = DefaultsKit; 219 | productReference = A0AC4AA01F43853D0070F91D /* DefaultsKit.framework */; 220 | productType = "com.apple.product-type.framework"; 221 | }; 222 | A0AC4AA81F43853D0070F91D /* DefaultsKit iOS Tests */ = { 223 | isa = PBXNativeTarget; 224 | buildConfigurationList = A0AC4AB71F43853D0070F91D /* Build configuration list for PBXNativeTarget "DefaultsKit iOS Tests" */; 225 | buildPhases = ( 226 | A0AC4AA51F43853D0070F91D /* Sources */, 227 | A0AC4AA61F43853D0070F91D /* Frameworks */, 228 | A0AC4AA71F43853D0070F91D /* Resources */, 229 | ); 230 | buildRules = ( 231 | ); 232 | dependencies = ( 233 | A0AC4AAC1F43853D0070F91D /* PBXTargetDependency */, 234 | ); 235 | name = "DefaultsKit iOS Tests"; 236 | productName = DefaultsKitTests; 237 | productReference = A0AC4AA91F43853D0070F91D /* DefaultsKit iOS Tests.xctest */; 238 | productType = "com.apple.product-type.bundle.unit-test"; 239 | }; 240 | A0F000E81F48CECE00617715 /* DefaultsKit macOS */ = { 241 | isa = PBXNativeTarget; 242 | buildConfigurationList = A0F000F21F48CECE00617715 /* Build configuration list for PBXNativeTarget "DefaultsKit macOS" */; 243 | buildPhases = ( 244 | A0F000E41F48CECE00617715 /* Sources */, 245 | A0F000E51F48CECE00617715 /* Frameworks */, 246 | A0F000E61F48CECE00617715 /* Headers */, 247 | A0F000E71F48CECE00617715 /* Resources */, 248 | ); 249 | buildRules = ( 250 | ); 251 | dependencies = ( 252 | ); 253 | name = "DefaultsKit macOS"; 254 | productName = "DefaultsKit macOS"; 255 | productReference = A0F000E91F48CECE00617715 /* DefaultsKit.framework */; 256 | productType = "com.apple.product-type.framework"; 257 | }; 258 | A0F000FB1F48CF8200617715 /* DefaultsKit tvOS */ = { 259 | isa = PBXNativeTarget; 260 | buildConfigurationList = A0F001011F48CF8200617715 /* Build configuration list for PBXNativeTarget "DefaultsKit tvOS" */; 261 | buildPhases = ( 262 | A0F000F71F48CF8200617715 /* Sources */, 263 | A0F000F81F48CF8200617715 /* Frameworks */, 264 | A0F000F91F48CF8200617715 /* Headers */, 265 | A0F000FA1F48CF8200617715 /* Resources */, 266 | ); 267 | buildRules = ( 268 | ); 269 | dependencies = ( 270 | ); 271 | name = "DefaultsKit tvOS"; 272 | productName = "DefaultsKit tvOS"; 273 | productReference = A0F000FC1F48CF8200617715 /* DefaultsKit.framework */; 274 | productType = "com.apple.product-type.framework"; 275 | }; 276 | A0F001181F48D0BD00617715 /* DefaultsKit macOS Tests */ = { 277 | isa = PBXNativeTarget; 278 | buildConfigurationList = A0F001211F48D0BD00617715 /* Build configuration list for PBXNativeTarget "DefaultsKit macOS Tests" */; 279 | buildPhases = ( 280 | A0F001151F48D0BD00617715 /* Sources */, 281 | A0F001161F48D0BD00617715 /* Frameworks */, 282 | A0F001171F48D0BD00617715 /* Resources */, 283 | ); 284 | buildRules = ( 285 | ); 286 | dependencies = ( 287 | A0F001201F48D0BD00617715 /* PBXTargetDependency */, 288 | ); 289 | name = "DefaultsKit macOS Tests"; 290 | productName = "DefaultsKit macOS Tests"; 291 | productReference = A0F001191F48D0BD00617715 /* DefaultsKit macOS Tests.xctest */; 292 | productType = "com.apple.product-type.bundle.unit-test"; 293 | }; 294 | A0F0012B1F48D34200617715 /* DefaultsKit tvOS Tests */ = { 295 | isa = PBXNativeTarget; 296 | buildConfigurationList = A0F001341F48D34200617715 /* Build configuration list for PBXNativeTarget "DefaultsKit tvOS Tests" */; 297 | buildPhases = ( 298 | A0F001281F48D34200617715 /* Sources */, 299 | A0F001291F48D34200617715 /* Frameworks */, 300 | A0F0012A1F48D34200617715 /* Resources */, 301 | ); 302 | buildRules = ( 303 | ); 304 | dependencies = ( 305 | A0F001331F48D34200617715 /* PBXTargetDependency */, 306 | ); 307 | name = "DefaultsKit tvOS Tests"; 308 | productName = "DefaultsKit tvOS Tests"; 309 | productReference = A0F0012C1F48D34200617715 /* DefaultsKit tvOS Tests.xctest */; 310 | productType = "com.apple.product-type.bundle.unit-test"; 311 | }; 312 | /* End PBXNativeTarget section */ 313 | 314 | /* Begin PBXProject section */ 315 | A0AC4A971F43853D0070F91D /* Project object */ = { 316 | isa = PBXProject; 317 | attributes = { 318 | BuildIndependentTargetsInParallel = YES; 319 | LastSwiftUpdateCheck = 0900; 320 | LastUpgradeCheck = 1610; 321 | ORGANIZATIONNAME = "Nuno Dias"; 322 | TargetAttributes = { 323 | A0AC4A9F1F43853D0070F91D = { 324 | CreatedOnToolsVersion = 9.0; 325 | LastSwiftMigration = 1130; 326 | }; 327 | A0AC4AA81F43853D0070F91D = { 328 | CreatedOnToolsVersion = 9.0; 329 | LastSwiftMigration = 1130; 330 | }; 331 | A0F000E81F48CECE00617715 = { 332 | CreatedOnToolsVersion = 9.0; 333 | LastSwiftMigration = 1130; 334 | }; 335 | A0F000FB1F48CF8200617715 = { 336 | CreatedOnToolsVersion = 9.0; 337 | LastSwiftMigration = 1130; 338 | }; 339 | A0F001181F48D0BD00617715 = { 340 | CreatedOnToolsVersion = 9.0; 341 | LastSwiftMigration = 1130; 342 | }; 343 | A0F0012B1F48D34200617715 = { 344 | CreatedOnToolsVersion = 9.0; 345 | LastSwiftMigration = 1130; 346 | }; 347 | }; 348 | }; 349 | buildConfigurationList = A0AC4A9A1F43853D0070F91D /* Build configuration list for PBXProject "DefaultsKit" */; 350 | compatibilityVersion = "Xcode 8.0"; 351 | developmentRegion = en; 352 | hasScannedForEncodings = 0; 353 | knownRegions = ( 354 | en, 355 | Base, 356 | ); 357 | mainGroup = A0AC4A961F43853D0070F91D; 358 | productRefGroup = A0AC4AA11F43853D0070F91D /* Products */; 359 | projectDirPath = ""; 360 | projectRoot = ""; 361 | targets = ( 362 | A0AC4A9F1F43853D0070F91D /* DefaultsKit iOS */, 363 | A0F000FB1F48CF8200617715 /* DefaultsKit tvOS */, 364 | A0F000E81F48CECE00617715 /* DefaultsKit macOS */, 365 | A0AC4AA81F43853D0070F91D /* DefaultsKit iOS Tests */, 366 | A0F0012B1F48D34200617715 /* DefaultsKit tvOS Tests */, 367 | A0F001181F48D0BD00617715 /* DefaultsKit macOS Tests */, 368 | ); 369 | }; 370 | /* End PBXProject section */ 371 | 372 | /* Begin PBXResourcesBuildPhase section */ 373 | A0AC4A9E1F43853D0070F91D /* Resources */ = { 374 | isa = PBXResourcesBuildPhase; 375 | buildActionMask = 2147483647; 376 | files = ( 377 | ); 378 | runOnlyForDeploymentPostprocessing = 0; 379 | }; 380 | A0AC4AA71F43853D0070F91D /* Resources */ = { 381 | isa = PBXResourcesBuildPhase; 382 | buildActionMask = 2147483647; 383 | files = ( 384 | ); 385 | runOnlyForDeploymentPostprocessing = 0; 386 | }; 387 | A0F000E71F48CECE00617715 /* Resources */ = { 388 | isa = PBXResourcesBuildPhase; 389 | buildActionMask = 2147483647; 390 | files = ( 391 | ); 392 | runOnlyForDeploymentPostprocessing = 0; 393 | }; 394 | A0F000FA1F48CF8200617715 /* Resources */ = { 395 | isa = PBXResourcesBuildPhase; 396 | buildActionMask = 2147483647; 397 | files = ( 398 | ); 399 | runOnlyForDeploymentPostprocessing = 0; 400 | }; 401 | A0F001171F48D0BD00617715 /* Resources */ = { 402 | isa = PBXResourcesBuildPhase; 403 | buildActionMask = 2147483647; 404 | files = ( 405 | ); 406 | runOnlyForDeploymentPostprocessing = 0; 407 | }; 408 | A0F0012A1F48D34200617715 /* Resources */ = { 409 | isa = PBXResourcesBuildPhase; 410 | buildActionMask = 2147483647; 411 | files = ( 412 | ); 413 | runOnlyForDeploymentPostprocessing = 0; 414 | }; 415 | /* End PBXResourcesBuildPhase section */ 416 | 417 | /* Begin PBXSourcesBuildPhase section */ 418 | A0AC4A9B1F43853D0070F91D /* Sources */ = { 419 | isa = PBXSourcesBuildPhase; 420 | buildActionMask = 2147483647; 421 | files = ( 422 | A0AC4ABB1F4385500070F91D /* Defaults.swift in Sources */, 423 | ); 424 | runOnlyForDeploymentPostprocessing = 0; 425 | }; 426 | A0AC4AA51F43853D0070F91D /* Sources */ = { 427 | isa = PBXSourcesBuildPhase; 428 | buildActionMask = 2147483647; 429 | files = ( 430 | A08335BE2CEA2453009E4AAF /* DefaultsKey + keys.swift in Sources */, 431 | A08335BF2CEA2453009E4AAF /* DefaultsTests.swift in Sources */, 432 | A08335C02CEA2453009E4AAF /* Mocks.swift in Sources */, 433 | ); 434 | runOnlyForDeploymentPostprocessing = 0; 435 | }; 436 | A0F000E41F48CECE00617715 /* Sources */ = { 437 | isa = PBXSourcesBuildPhase; 438 | buildActionMask = 2147483647; 439 | files = ( 440 | A0F000F61F48CEE500617715 /* Defaults.swift in Sources */, 441 | ); 442 | runOnlyForDeploymentPostprocessing = 0; 443 | }; 444 | A0F000F71F48CF8200617715 /* Sources */ = { 445 | isa = PBXSourcesBuildPhase; 446 | buildActionMask = 2147483647; 447 | files = ( 448 | A0F001041F48CF9D00617715 /* Defaults.swift in Sources */, 449 | ); 450 | runOnlyForDeploymentPostprocessing = 0; 451 | }; 452 | A0F001151F48D0BD00617715 /* Sources */ = { 453 | isa = PBXSourcesBuildPhase; 454 | buildActionMask = 2147483647; 455 | files = ( 456 | A08335B82CEA2453009E4AAF /* DefaultsKey + keys.swift in Sources */, 457 | A08335B92CEA2453009E4AAF /* DefaultsTests.swift in Sources */, 458 | A08335BA2CEA2453009E4AAF /* Mocks.swift in Sources */, 459 | ); 460 | runOnlyForDeploymentPostprocessing = 0; 461 | }; 462 | A0F001281F48D34200617715 /* Sources */ = { 463 | isa = PBXSourcesBuildPhase; 464 | buildActionMask = 2147483647; 465 | files = ( 466 | A08335BB2CEA2453009E4AAF /* DefaultsKey + keys.swift in Sources */, 467 | A08335BC2CEA2453009E4AAF /* DefaultsTests.swift in Sources */, 468 | A08335BD2CEA2453009E4AAF /* Mocks.swift in Sources */, 469 | ); 470 | runOnlyForDeploymentPostprocessing = 0; 471 | }; 472 | /* End PBXSourcesBuildPhase section */ 473 | 474 | /* Begin PBXTargetDependency section */ 475 | A0AC4AAC1F43853D0070F91D /* PBXTargetDependency */ = { 476 | isa = PBXTargetDependency; 477 | target = A0AC4A9F1F43853D0070F91D /* DefaultsKit iOS */; 478 | targetProxy = A0AC4AAB1F43853D0070F91D /* PBXContainerItemProxy */; 479 | }; 480 | A0F001201F48D0BD00617715 /* PBXTargetDependency */ = { 481 | isa = PBXTargetDependency; 482 | target = A0F000E81F48CECE00617715 /* DefaultsKit macOS */; 483 | targetProxy = A0F0011F1F48D0BD00617715 /* PBXContainerItemProxy */; 484 | }; 485 | A0F001331F48D34200617715 /* PBXTargetDependency */ = { 486 | isa = PBXTargetDependency; 487 | target = A0F000FB1F48CF8200617715 /* DefaultsKit tvOS */; 488 | targetProxy = A0F001321F48D34200617715 /* PBXContainerItemProxy */; 489 | }; 490 | /* End PBXTargetDependency section */ 491 | 492 | /* Begin XCBuildConfiguration section */ 493 | A0AC4AB21F43853D0070F91D /* Debug */ = { 494 | isa = XCBuildConfiguration; 495 | buildSettings = { 496 | ALWAYS_SEARCH_USER_PATHS = NO; 497 | CLANG_ANALYZER_NONNULL = YES; 498 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 499 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 500 | CLANG_CXX_LIBRARY = "libc++"; 501 | CLANG_ENABLE_MODULES = YES; 502 | CLANG_ENABLE_OBJC_ARC = YES; 503 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 504 | CLANG_WARN_BOOL_CONVERSION = YES; 505 | CLANG_WARN_COMMA = YES; 506 | CLANG_WARN_CONSTANT_CONVERSION = YES; 507 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 508 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 509 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 510 | CLANG_WARN_EMPTY_BODY = YES; 511 | CLANG_WARN_ENUM_CONVERSION = YES; 512 | CLANG_WARN_INFINITE_RECURSION = YES; 513 | CLANG_WARN_INT_CONVERSION = YES; 514 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 515 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 516 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 517 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 518 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 519 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 520 | CLANG_WARN_STRICT_PROTOTYPES = YES; 521 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 522 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 523 | CLANG_WARN_UNREACHABLE_CODE = YES; 524 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 525 | CODE_SIGN_IDENTITY = "iPhone Developer"; 526 | COPY_PHASE_STRIP = NO; 527 | CURRENT_PROJECT_VERSION = 1; 528 | DEBUG_INFORMATION_FORMAT = dwarf; 529 | ENABLE_STRICT_OBJC_MSGSEND = YES; 530 | ENABLE_TESTABILITY = YES; 531 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 532 | GCC_C_LANGUAGE_STANDARD = gnu11; 533 | GCC_DYNAMIC_NO_PIC = NO; 534 | GCC_NO_COMMON_BLOCKS = YES; 535 | GCC_OPTIMIZATION_LEVEL = 0; 536 | GCC_PREPROCESSOR_DEFINITIONS = ( 537 | "DEBUG=1", 538 | "$(inherited)", 539 | ); 540 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 541 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 542 | GCC_WARN_UNDECLARED_SELECTOR = YES; 543 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 544 | GCC_WARN_UNUSED_FUNCTION = YES; 545 | GCC_WARN_UNUSED_VARIABLE = YES; 546 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 547 | MACOSX_DEPLOYMENT_TARGET = 10.10; 548 | MTL_ENABLE_DEBUG_INFO = YES; 549 | ONLY_ACTIVE_ARCH = YES; 550 | SDKROOT = iphoneos; 551 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 552 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 553 | SWIFT_VERSION = 6.0; 554 | VERSIONING_SYSTEM = "apple-generic"; 555 | VERSION_INFO_PREFIX = ""; 556 | }; 557 | name = Debug; 558 | }; 559 | A0AC4AB31F43853D0070F91D /* Release */ = { 560 | isa = XCBuildConfiguration; 561 | buildSettings = { 562 | ALWAYS_SEARCH_USER_PATHS = NO; 563 | CLANG_ANALYZER_NONNULL = YES; 564 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 565 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 566 | CLANG_CXX_LIBRARY = "libc++"; 567 | CLANG_ENABLE_MODULES = YES; 568 | CLANG_ENABLE_OBJC_ARC = YES; 569 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 570 | CLANG_WARN_BOOL_CONVERSION = YES; 571 | CLANG_WARN_COMMA = YES; 572 | CLANG_WARN_CONSTANT_CONVERSION = YES; 573 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 574 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 575 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 576 | CLANG_WARN_EMPTY_BODY = YES; 577 | CLANG_WARN_ENUM_CONVERSION = YES; 578 | CLANG_WARN_INFINITE_RECURSION = YES; 579 | CLANG_WARN_INT_CONVERSION = YES; 580 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 581 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 582 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 583 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 584 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 585 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 586 | CLANG_WARN_STRICT_PROTOTYPES = YES; 587 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 588 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 589 | CLANG_WARN_UNREACHABLE_CODE = YES; 590 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 591 | CODE_SIGN_IDENTITY = "iPhone Developer"; 592 | COPY_PHASE_STRIP = NO; 593 | CURRENT_PROJECT_VERSION = 1; 594 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 595 | ENABLE_NS_ASSERTIONS = NO; 596 | ENABLE_STRICT_OBJC_MSGSEND = YES; 597 | ENABLE_USER_SCRIPT_SANDBOXING = YES; 598 | GCC_C_LANGUAGE_STANDARD = gnu11; 599 | GCC_NO_COMMON_BLOCKS = YES; 600 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 601 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 602 | GCC_WARN_UNDECLARED_SELECTOR = YES; 603 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 604 | GCC_WARN_UNUSED_FUNCTION = YES; 605 | GCC_WARN_UNUSED_VARIABLE = YES; 606 | IPHONEOS_DEPLOYMENT_TARGET = 12.0; 607 | MACOSX_DEPLOYMENT_TARGET = 10.10; 608 | MTL_ENABLE_DEBUG_INFO = NO; 609 | SDKROOT = iphoneos; 610 | SWIFT_COMPILATION_MODE = wholemodule; 611 | SWIFT_OPTIMIZATION_LEVEL = "-O"; 612 | SWIFT_VERSION = 6.0; 613 | VALIDATE_PRODUCT = YES; 614 | VERSIONING_SYSTEM = "apple-generic"; 615 | VERSION_INFO_PREFIX = ""; 616 | }; 617 | name = Release; 618 | }; 619 | A0AC4AB51F43853D0070F91D /* Debug */ = { 620 | isa = XCBuildConfiguration; 621 | buildSettings = { 622 | CLANG_ENABLE_MODULES = YES; 623 | CODE_SIGN_IDENTITY = "-"; 624 | DEFINES_MODULE = YES; 625 | DYLIB_COMPATIBILITY_VERSION = 1; 626 | DYLIB_CURRENT_VERSION = 1; 627 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 628 | ENABLE_MODULE_VERIFIER = YES; 629 | INFOPLIST_FILE = Sources/Info.plist; 630 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 631 | LD_RUNPATH_SEARCH_PATHS = ( 632 | "$(inherited)", 633 | "@executable_path/Frameworks", 634 | "@loader_path/Frameworks", 635 | ); 636 | MACOSX_DEPLOYMENT_TARGET = 11.0; 637 | MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; 638 | PRODUCT_BUNDLE_IDENTIFIER = com.nmdias.DefaultsKit; 639 | PRODUCT_NAME = DefaultsKit; 640 | SKIP_INSTALL = YES; 641 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 642 | SWIFT_VERSION = 5.0; 643 | TARGETED_DEVICE_FAMILY = "1,2"; 644 | }; 645 | name = Debug; 646 | }; 647 | A0AC4AB61F43853D0070F91D /* Release */ = { 648 | isa = XCBuildConfiguration; 649 | buildSettings = { 650 | CLANG_ENABLE_MODULES = YES; 651 | CODE_SIGN_IDENTITY = "-"; 652 | DEFINES_MODULE = YES; 653 | DYLIB_COMPATIBILITY_VERSION = 1; 654 | DYLIB_CURRENT_VERSION = 1; 655 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 656 | ENABLE_MODULE_VERIFIER = YES; 657 | INFOPLIST_FILE = Sources/Info.plist; 658 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 659 | LD_RUNPATH_SEARCH_PATHS = ( 660 | "$(inherited)", 661 | "@executable_path/Frameworks", 662 | "@loader_path/Frameworks", 663 | ); 664 | MACOSX_DEPLOYMENT_TARGET = 11.0; 665 | MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; 666 | PRODUCT_BUNDLE_IDENTIFIER = com.nmdias.DefaultsKit; 667 | PRODUCT_NAME = DefaultsKit; 668 | SKIP_INSTALL = YES; 669 | SWIFT_VERSION = 5.0; 670 | TARGETED_DEVICE_FAMILY = "1,2"; 671 | }; 672 | name = Release; 673 | }; 674 | A0AC4AB81F43853D0070F91D /* Debug */ = { 675 | isa = XCBuildConfiguration; 676 | buildSettings = { 677 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; 678 | INFOPLIST_FILE = Tests/Info.plist; 679 | LD_RUNPATH_SEARCH_PATHS = ( 680 | "$(inherited)", 681 | "@executable_path/Frameworks", 682 | "@loader_path/Frameworks", 683 | ); 684 | MACOSX_DEPLOYMENT_TARGET = 11.0; 685 | PRODUCT_BUNDLE_IDENTIFIER = com.nmdias.DefaultsKitTests; 686 | PRODUCT_NAME = "$(TARGET_NAME)"; 687 | SWIFT_VERSION = 5.0; 688 | TARGETED_DEVICE_FAMILY = "1,2"; 689 | }; 690 | name = Debug; 691 | }; 692 | A0AC4AB91F43853D0070F91D /* Release */ = { 693 | isa = XCBuildConfiguration; 694 | buildSettings = { 695 | "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; 696 | INFOPLIST_FILE = Tests/Info.plist; 697 | LD_RUNPATH_SEARCH_PATHS = ( 698 | "$(inherited)", 699 | "@executable_path/Frameworks", 700 | "@loader_path/Frameworks", 701 | ); 702 | MACOSX_DEPLOYMENT_TARGET = 11.0; 703 | PRODUCT_BUNDLE_IDENTIFIER = com.nmdias.DefaultsKitTests; 704 | PRODUCT_NAME = "$(TARGET_NAME)"; 705 | SWIFT_VERSION = 5.0; 706 | TARGETED_DEVICE_FAMILY = "1,2"; 707 | }; 708 | name = Release; 709 | }; 710 | A0F000F31F48CECE00617715 /* Debug */ = { 711 | isa = XCBuildConfiguration; 712 | buildSettings = { 713 | CODE_SIGN_IDENTITY = "-"; 714 | COMBINE_HIDPI_IMAGES = YES; 715 | DEAD_CODE_STRIPPING = YES; 716 | DEFINES_MODULE = YES; 717 | DYLIB_COMPATIBILITY_VERSION = 1; 718 | DYLIB_CURRENT_VERSION = 1; 719 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 720 | ENABLE_MODULE_VERIFIER = YES; 721 | FRAMEWORK_VERSION = A; 722 | INFOPLIST_FILE = Sources/Info.plist; 723 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 724 | LD_RUNPATH_SEARCH_PATHS = ( 725 | "$(inherited)", 726 | "@executable_path/../Frameworks", 727 | "@loader_path/Frameworks", 728 | ); 729 | MACOSX_DEPLOYMENT_TARGET = 11.0; 730 | MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; 731 | PRODUCT_BUNDLE_IDENTIFIER = "com.nmdias.DefaultsKit-macOS"; 732 | PRODUCT_NAME = DefaultsKit; 733 | SDKROOT = macosx; 734 | SKIP_INSTALL = YES; 735 | SWIFT_VERSION = 5.0; 736 | }; 737 | name = Debug; 738 | }; 739 | A0F000F41F48CECE00617715 /* Release */ = { 740 | isa = XCBuildConfiguration; 741 | buildSettings = { 742 | CODE_SIGN_IDENTITY = "-"; 743 | COMBINE_HIDPI_IMAGES = YES; 744 | DEAD_CODE_STRIPPING = YES; 745 | DEFINES_MODULE = YES; 746 | DYLIB_COMPATIBILITY_VERSION = 1; 747 | DYLIB_CURRENT_VERSION = 1; 748 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 749 | ENABLE_MODULE_VERIFIER = YES; 750 | FRAMEWORK_VERSION = A; 751 | INFOPLIST_FILE = Sources/Info.plist; 752 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 753 | LD_RUNPATH_SEARCH_PATHS = ( 754 | "$(inherited)", 755 | "@executable_path/../Frameworks", 756 | "@loader_path/Frameworks", 757 | ); 758 | MACOSX_DEPLOYMENT_TARGET = 11.0; 759 | MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; 760 | PRODUCT_BUNDLE_IDENTIFIER = "com.nmdias.DefaultsKit-macOS"; 761 | PRODUCT_NAME = DefaultsKit; 762 | SDKROOT = macosx; 763 | SKIP_INSTALL = YES; 764 | SWIFT_VERSION = 5.0; 765 | }; 766 | name = Release; 767 | }; 768 | A0F001021F48CF8200617715 /* Debug */ = { 769 | isa = XCBuildConfiguration; 770 | buildSettings = { 771 | CODE_SIGN_IDENTITY = ""; 772 | DEFINES_MODULE = YES; 773 | DYLIB_COMPATIBILITY_VERSION = 1; 774 | DYLIB_CURRENT_VERSION = 1; 775 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 776 | ENABLE_MODULE_VERIFIER = YES; 777 | INFOPLIST_FILE = Sources/Info.plist; 778 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 779 | LD_RUNPATH_SEARCH_PATHS = ( 780 | "$(inherited)", 781 | "@executable_path/Frameworks", 782 | "@loader_path/Frameworks", 783 | ); 784 | MACOSX_DEPLOYMENT_TARGET = 11.0; 785 | MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; 786 | PRODUCT_BUNDLE_IDENTIFIER = "com.nmdias.DefaultsKit-tvOS"; 787 | PRODUCT_NAME = DefaultsKit; 788 | SDKROOT = appletvos; 789 | SKIP_INSTALL = YES; 790 | SWIFT_VERSION = 5.0; 791 | TARGETED_DEVICE_FAMILY = 3; 792 | TVOS_DEPLOYMENT_TARGET = 12.0; 793 | }; 794 | name = Debug; 795 | }; 796 | A0F001031F48CF8200617715 /* Release */ = { 797 | isa = XCBuildConfiguration; 798 | buildSettings = { 799 | CODE_SIGN_IDENTITY = ""; 800 | DEFINES_MODULE = YES; 801 | DYLIB_COMPATIBILITY_VERSION = 1; 802 | DYLIB_CURRENT_VERSION = 1; 803 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 804 | ENABLE_MODULE_VERIFIER = YES; 805 | INFOPLIST_FILE = Sources/Info.plist; 806 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 807 | LD_RUNPATH_SEARCH_PATHS = ( 808 | "$(inherited)", 809 | "@executable_path/Frameworks", 810 | "@loader_path/Frameworks", 811 | ); 812 | MACOSX_DEPLOYMENT_TARGET = 11.0; 813 | MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu11 gnu++14"; 814 | PRODUCT_BUNDLE_IDENTIFIER = "com.nmdias.DefaultsKit-tvOS"; 815 | PRODUCT_NAME = DefaultsKit; 816 | SDKROOT = appletvos; 817 | SKIP_INSTALL = YES; 818 | SWIFT_VERSION = 5.0; 819 | TARGETED_DEVICE_FAMILY = 3; 820 | TVOS_DEPLOYMENT_TARGET = 12.0; 821 | }; 822 | name = Release; 823 | }; 824 | A0F001221F48D0BD00617715 /* Debug */ = { 825 | isa = XCBuildConfiguration; 826 | buildSettings = { 827 | CODE_SIGN_IDENTITY = "-"; 828 | COMBINE_HIDPI_IMAGES = YES; 829 | DEAD_CODE_STRIPPING = YES; 830 | INFOPLIST_FILE = Tests/Info.plist; 831 | LD_RUNPATH_SEARCH_PATHS = ( 832 | "$(inherited)", 833 | "@executable_path/../Frameworks", 834 | "@loader_path/../Frameworks", 835 | ); 836 | MACOSX_DEPLOYMENT_TARGET = 11.0; 837 | PRODUCT_BUNDLE_IDENTIFIER = "com.nmdias.DefaultsKit-macOS-Tests"; 838 | PRODUCT_NAME = "$(TARGET_NAME)"; 839 | SDKROOT = macosx; 840 | SWIFT_VERSION = 5.0; 841 | }; 842 | name = Debug; 843 | }; 844 | A0F001231F48D0BD00617715 /* Release */ = { 845 | isa = XCBuildConfiguration; 846 | buildSettings = { 847 | CODE_SIGN_IDENTITY = "-"; 848 | COMBINE_HIDPI_IMAGES = YES; 849 | DEAD_CODE_STRIPPING = YES; 850 | INFOPLIST_FILE = Tests/Info.plist; 851 | LD_RUNPATH_SEARCH_PATHS = ( 852 | "$(inherited)", 853 | "@executable_path/../Frameworks", 854 | "@loader_path/../Frameworks", 855 | ); 856 | MACOSX_DEPLOYMENT_TARGET = 11.0; 857 | PRODUCT_BUNDLE_IDENTIFIER = "com.nmdias.DefaultsKit-macOS-Tests"; 858 | PRODUCT_NAME = "$(TARGET_NAME)"; 859 | SDKROOT = macosx; 860 | SWIFT_VERSION = 5.0; 861 | }; 862 | name = Release; 863 | }; 864 | A0F001351F48D34200617715 /* Debug */ = { 865 | isa = XCBuildConfiguration; 866 | buildSettings = { 867 | DEVELOPMENT_TEAM = ""; 868 | INFOPLIST_FILE = Tests/Info.plist; 869 | LD_RUNPATH_SEARCH_PATHS = ( 870 | "$(inherited)", 871 | "@executable_path/Frameworks", 872 | "@loader_path/Frameworks", 873 | ); 874 | MACOSX_DEPLOYMENT_TARGET = 11.0; 875 | PRODUCT_BUNDLE_IDENTIFIER = "com.nmdias.DefaultsKit-tvOS-Tests"; 876 | PRODUCT_NAME = "$(TARGET_NAME)"; 877 | SDKROOT = appletvos; 878 | SWIFT_VERSION = 5.0; 879 | TARGETED_DEVICE_FAMILY = 3; 880 | TVOS_DEPLOYMENT_TARGET = 12.0; 881 | }; 882 | name = Debug; 883 | }; 884 | A0F001361F48D34200617715 /* Release */ = { 885 | isa = XCBuildConfiguration; 886 | buildSettings = { 887 | DEVELOPMENT_TEAM = ""; 888 | INFOPLIST_FILE = Tests/Info.plist; 889 | LD_RUNPATH_SEARCH_PATHS = ( 890 | "$(inherited)", 891 | "@executable_path/Frameworks", 892 | "@loader_path/Frameworks", 893 | ); 894 | MACOSX_DEPLOYMENT_TARGET = 11.0; 895 | PRODUCT_BUNDLE_IDENTIFIER = "com.nmdias.DefaultsKit-tvOS-Tests"; 896 | PRODUCT_NAME = "$(TARGET_NAME)"; 897 | SDKROOT = appletvos; 898 | SWIFT_VERSION = 5.0; 899 | TARGETED_DEVICE_FAMILY = 3; 900 | TVOS_DEPLOYMENT_TARGET = 12.0; 901 | }; 902 | name = Release; 903 | }; 904 | /* End XCBuildConfiguration section */ 905 | 906 | /* Begin XCConfigurationList section */ 907 | A0AC4A9A1F43853D0070F91D /* Build configuration list for PBXProject "DefaultsKit" */ = { 908 | isa = XCConfigurationList; 909 | buildConfigurations = ( 910 | A0AC4AB21F43853D0070F91D /* Debug */, 911 | A0AC4AB31F43853D0070F91D /* Release */, 912 | ); 913 | defaultConfigurationIsVisible = 0; 914 | defaultConfigurationName = Release; 915 | }; 916 | A0AC4AB41F43853D0070F91D /* Build configuration list for PBXNativeTarget "DefaultsKit iOS" */ = { 917 | isa = XCConfigurationList; 918 | buildConfigurations = ( 919 | A0AC4AB51F43853D0070F91D /* Debug */, 920 | A0AC4AB61F43853D0070F91D /* Release */, 921 | ); 922 | defaultConfigurationIsVisible = 0; 923 | defaultConfigurationName = Release; 924 | }; 925 | A0AC4AB71F43853D0070F91D /* Build configuration list for PBXNativeTarget "DefaultsKit iOS Tests" */ = { 926 | isa = XCConfigurationList; 927 | buildConfigurations = ( 928 | A0AC4AB81F43853D0070F91D /* Debug */, 929 | A0AC4AB91F43853D0070F91D /* Release */, 930 | ); 931 | defaultConfigurationIsVisible = 0; 932 | defaultConfigurationName = Release; 933 | }; 934 | A0F000F21F48CECE00617715 /* Build configuration list for PBXNativeTarget "DefaultsKit macOS" */ = { 935 | isa = XCConfigurationList; 936 | buildConfigurations = ( 937 | A0F000F31F48CECE00617715 /* Debug */, 938 | A0F000F41F48CECE00617715 /* Release */, 939 | ); 940 | defaultConfigurationIsVisible = 0; 941 | defaultConfigurationName = Release; 942 | }; 943 | A0F001011F48CF8200617715 /* Build configuration list for PBXNativeTarget "DefaultsKit tvOS" */ = { 944 | isa = XCConfigurationList; 945 | buildConfigurations = ( 946 | A0F001021F48CF8200617715 /* Debug */, 947 | A0F001031F48CF8200617715 /* Release */, 948 | ); 949 | defaultConfigurationIsVisible = 0; 950 | defaultConfigurationName = Release; 951 | }; 952 | A0F001211F48D0BD00617715 /* Build configuration list for PBXNativeTarget "DefaultsKit macOS Tests" */ = { 953 | isa = XCConfigurationList; 954 | buildConfigurations = ( 955 | A0F001221F48D0BD00617715 /* Debug */, 956 | A0F001231F48D0BD00617715 /* Release */, 957 | ); 958 | defaultConfigurationIsVisible = 0; 959 | defaultConfigurationName = Release; 960 | }; 961 | A0F001341F48D34200617715 /* Build configuration list for PBXNativeTarget "DefaultsKit tvOS Tests" */ = { 962 | isa = XCConfigurationList; 963 | buildConfigurations = ( 964 | A0F001351F48D34200617715 /* Debug */, 965 | A0F001361F48D34200617715 /* Release */, 966 | ); 967 | defaultConfigurationIsVisible = 0; 968 | defaultConfigurationName = Release; 969 | }; 970 | /* End XCConfigurationList section */ 971 | }; 972 | rootObject = A0AC4A971F43853D0070F91D /* Project object */; 973 | } 974 | --------------------------------------------------------------------------------