@@ -128,21 +128,38 @@ open class FileManager : NSObject {
128
128
case network
129
129
case user
130
130
131
+ static let correspondingValues : [ UInt : _SearchPathDomain ] = [
132
+ SearchPathDomainMask . systemDomainMask. rawValue: . system,
133
+ SearchPathDomainMask . localDomainMask. rawValue: . local,
134
+ SearchPathDomainMask . networkDomainMask. rawValue: . network,
135
+ SearchPathDomainMask . userDomainMask. rawValue: . user,
136
+ ]
137
+
138
+ static let searchOrder : [ SearchPathDomainMask ] = [
139
+ . systemDomainMask,
140
+ . localDomainMask,
141
+ . networkDomainMask,
142
+ . userDomainMask,
143
+ ]
144
+
131
145
init ? ( _ domainMask: SearchPathDomainMask ) {
132
- if domainMask == . systemDomainMask {
133
- self = . system; return
134
- }
135
- if domainMask == . localDomainMask {
136
- self = . local; return
137
- }
138
- if domainMask == . networkDomainMask {
139
- self = . network; return
146
+ if let value = _SearchPathDomain. correspondingValues [ domainMask. rawValue] {
147
+ self = value
148
+ } else {
149
+ return nil
140
150
}
141
- if domainMask == . userDomainMask {
142
- self = . user; return
151
+ }
152
+
153
+ static func allInSearchOrder( from domainMask: SearchPathDomainMask ) -> [ _SearchPathDomain ] {
154
+ var domains : [ _SearchPathDomain ] = [ ]
155
+
156
+ for bit in _SearchPathDomain. searchOrder {
157
+ if domainMask. contains ( bit) {
158
+ domains. append ( _SearchPathDomain. correspondingValues [ bit. rawValue] !)
159
+ }
143
160
}
144
161
145
- return nil
162
+ return domains
146
163
}
147
164
}
148
165
@@ -185,9 +202,7 @@ open class FileManager : NSObject {
185
202
/* -URLsForDirectory:inDomains: is analogous to NSSearchPathForDirectoriesInDomains(), but returns an array of NSURL instances for use with URL-taking APIs. This API is suitable when you need to search for a file or files which may live in one of a variety of locations in the domains specified.
186
203
*/
187
204
open func urls( for directory: SearchPathDirectory , in domainMask: SearchPathDomainMask ) -> [ URL ] {
188
- guard let domain = _SearchPathDomain ( domainMask) else {
189
- fatalError ( " Values other than .systemDomainMask, .localDomainMask, .userDomainMask, .networkDomainMask are unsupported " )
190
- }
205
+ let domains = _SearchPathDomain. allInSearchOrder ( from: domainMask)
191
206
192
207
// We are going to return appropriate paths on Darwin, but [] on platforms that do not have comparable locations.
193
208
// For example, on FHS/XDG systems, applications are not installed in a single path.
@@ -203,11 +218,17 @@ open class FileManager : NSObject {
203
218
#endif
204
219
}
205
220
206
- if useDarwinPaths {
207
- return darwinURLs ( for: directory, in: domain)
208
- } else {
209
- return xdgURLs ( for: directory, in: domain)
221
+ var urls : [ URL ] = [ ]
222
+
223
+ for domain in domains {
224
+ if useDarwinPaths {
225
+ urls. append ( contentsOf: darwinURLs ( for: directory, in: domain) )
226
+ } else {
227
+ urls. append ( contentsOf: xdgURLs ( for: directory, in: domain) )
228
+ }
210
229
}
230
+
231
+ return urls
211
232
}
212
233
#endif
213
234
0 commit comments