Skip to content

Commit 9745d18

Browse files
committed
urls(for:…) can accept multiple search path domain bits, unlike url(for:…).
1 parent 03c77d9 commit 9745d18

File tree

1 file changed

+39
-18
lines changed

1 file changed

+39
-18
lines changed

Foundation/FileManager.swift

Lines changed: 39 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -128,21 +128,38 @@ open class FileManager : NSObject {
128128
case network
129129
case user
130130

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+
131145
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
140150
}
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+
}
143160
}
144161

145-
return nil
162+
return domains
146163
}
147164
}
148165

@@ -185,9 +202,7 @@ open class FileManager : NSObject {
185202
/* -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.
186203
*/
187204
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)
191206

192207
// We are going to return appropriate paths on Darwin, but [] on platforms that do not have comparable locations.
193208
// For example, on FHS/XDG systems, applications are not installed in a single path.
@@ -203,11 +218,17 @@ open class FileManager : NSObject {
203218
#endif
204219
}
205220

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+
}
210229
}
230+
231+
return urls
211232
}
212233
#endif
213234

0 commit comments

Comments
 (0)