├── 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 | 
3 |
4 | [](https://cocoapods.org/pods/DefaultsKit)
5 | [](https://github.com/Carthage/Carthage)
6 | [](https://swift.org)
7 | [](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 | 
2 |
3 | [](https://github.com/nmdias/DefaultsKit/actions)
4 | [](https://swiftpackageindex.com/nmdias/DefaultsKit)
5 | [](https://swiftpackageindex.com/nmdias/DefaultsKit)
6 |
7 | [](https://cocoapods.org/pods/DefaultsKit)
8 | [](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 |
--------------------------------------------------------------------------------