Skip to content
This repository was archived by the owner on Sep 15, 2025. It is now read-only.

Commit bcb7f78

Browse files
committed
Use [String: Any] instead of NSDictionary in RemoteBlogSettings
1 parent fb452a5 commit bcb7f78

File tree

2 files changed

+123
-117
lines changed

2 files changed

+123
-117
lines changed

Sources/WordPressKit/Models/RemoteBlogSettings.swift

Lines changed: 109 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -236,122 +236,124 @@ public class RemoteBlogSettings: NSObject {
236236

237237
/// Parses details from a JSON dictionary, as returned by the WordPress.com REST API.
238238
@objc
239-
public init(jsonDictionary json: NSDictionary) {
240-
let rawSettings = json.object(forKey: CodingKeys.settings.rawValue) as? NSDictionary ?? [:]
239+
public init(jsonDictionary json: [String: Any]) {
240+
let rawSettings = json[CodingKeys.settings.rawValue] as? [String: Any] ?? [:]
241241

242-
name = json.string(forKey: CodingKeys.name.rawValue)
243-
tagline = json.string(forKey: CodingKeys.tagline.rawValue)
244-
privacy = rawSettings.number(forKey: CodingKeys.privacy.rawValue)
242+
name = json[CodingKeys.name.rawValue] as? String
243+
tagline = json[CodingKeys.tagline.rawValue] as? String
244+
privacy = rawSettings[CodingKeys.privacy.rawValue] as? NSNumber
245+
// The value here can be a String, so we need a custom conversion
245246
languageID = rawSettings.number(forKey: CodingKeys.languageID.rawValue)
246-
iconMediaID = rawSettings.number(forKey: CodingKeys.iconMediaID.rawValue)
247+
iconMediaID = rawSettings[CodingKeys.iconMediaID.rawValue] as? NSNumber
248+
// The value here can be a String, so we need a custom conversion
247249
gmtOffset = rawSettings.number(forKey: CodingKeys.gmtOffset.rawValue)
248-
timezoneString = rawSettings.string(forKey: CodingKeys.timezoneString.rawValue)
250+
timezoneString = rawSettings[CodingKeys.timezoneString.rawValue] as? String
249251

250-
defaultCategoryID = rawSettings.number(forKey: CodingKeys.defaultCategory.rawValue) ?? 1
251-
let defaultPostFormatValue = rawSettings.object(forKey: CodingKeys.defaultPostFormat.rawValue)
252+
defaultCategoryID = rawSettings[CodingKeys.defaultCategory.rawValue] as? NSNumber ?? 1
253+
let defaultPostFormatValue = rawSettings[CodingKeys.defaultPostFormat.rawValue]
252254
if let defaultPostFormatNumber = defaultPostFormatValue as? NSNumber, defaultPostFormatNumber == 0 ||
253255
defaultPostFormatValue as? String == "0" {
254256
defaultPostFormat = "standard"
255257
} else {
256-
defaultPostFormat = rawSettings.string(forKey: CodingKeys.defaultPostFormat.rawValue)
258+
defaultPostFormat = defaultPostFormatValue as? String
257259
}
258-
dateFormat = rawSettings.string(forKey: CodingKeys.dateFormat.rawValue)
259-
timeFormat = rawSettings.string(forKey: CodingKeys.timeFormat.rawValue)
260-
startOfWeek = rawSettings.string(forKey: CodingKeys.startOfWeek.rawValue)
261-
postsPerPage = rawSettings.number(forKey: CodingKeys.postsPerPage.rawValue)
262-
263-
commentsAllowed = rawSettings.number(forKey: CodingKeys.commentsAllowed.rawValue)
264-
commentsBlocklistKeys = rawSettings.string(forKey: CodingKeys.commentsBlocklistKeys.rawValue)
265-
commentsCloseAutomatically = rawSettings.number(forKey: CodingKeys.commentsCloseAutomatically.rawValue)
266-
commentsCloseAutomaticallyAfterDays = rawSettings.number(forKey: CodingKeys.commentsCloseAutomaticallyAfterDays.rawValue)
267-
commentsFromKnownUsersAllowlisted = rawSettings.number(forKey: CodingKeys.commentsKnownUsersAllowlist.rawValue)
268-
commentsMaximumLinks = rawSettings.number(forKey: CodingKeys.commentsMaxLinks.rawValue)
269-
commentsModerationKeys = rawSettings.string(forKey: CodingKeys.commentsModerationKeys.rawValue)
270-
commentsPagingEnabled = rawSettings.number(forKey: CodingKeys.commentsPagingEnabled.rawValue)
271-
commentsPageSize = rawSettings.number(forKey: CodingKeys.commentsPageSize.rawValue)
272-
commentsRequireManualModeration = rawSettings.number(forKey: CodingKeys.commentsRequireModeration.rawValue)
273-
commentsRequireNameAndEmail = rawSettings.number(forKey: CodingKeys.commentsRequireNameAndEmail.rawValue)
274-
commentsRequireRegistration = rawSettings.number(forKey: CodingKeys.commentsRequireRegistration.rawValue)
275-
commentsSortOrder = rawSettings.string(forKey: CodingKeys.commentsSortOrder.rawValue)
276-
commentsThreadingEnabled = rawSettings.number(forKey: CodingKeys.commentsThreadingEnabled.rawValue)
277-
commentsThreadingDepth = rawSettings.number(forKey: CodingKeys.commentsThreadingDepth.rawValue)
278-
pingbackOutboundEnabled = rawSettings.number(forKey: CodingKeys.pingbackOutbound.rawValue)
279-
pingbackInboundEnabled = rawSettings.number(forKey: CodingKeys.pingbackInbound.rawValue)
280-
281-
relatedPostsAllowed = rawSettings.number(forKey: CodingKeys.relatedPostsAllowed.rawValue)
282-
relatedPostsEnabled = rawSettings.number(forKey: CodingKeys.relatedPostsEnabled.rawValue)
283-
relatedPostsShowHeadline = rawSettings.number(forKey: CodingKeys.relatedPostsShowHeadline.rawValue)
284-
relatedPostsShowThumbnails = rawSettings.number(forKey: CodingKeys.relatedPostsShowThumbnails.rawValue)
285-
286-
ampSupported = rawSettings.number(forKey: CodingKeys.ampSupported.rawValue)
287-
ampEnabled = rawSettings.number(forKey: CodingKeys.ampEnabled.rawValue)
288-
289-
sharingButtonStyle = rawSettings.string(forKey: CodingKeys.sharingButtonStyle.rawValue)
290-
sharingLabel = rawSettings.string(forKey: CodingKeys.sharingLabel.rawValue)
291-
sharingTwitterName = rawSettings.string(forKey: CodingKeys.sharingTwitterName.rawValue)
292-
sharingCommentLikesEnabled = rawSettings.number(forKey: CodingKeys.sharingCommentLikesEnabled.rawValue)
293-
sharingDisabledLikes = rawSettings.number(forKey: CodingKeys.sharingDisabledLikes.rawValue)
294-
sharingDisabledReblogs = rawSettings.number(forKey: CodingKeys.sharingDisabledReblogs.rawValue)
260+
dateFormat = rawSettings[CodingKeys.dateFormat.rawValue] as? String
261+
timeFormat = rawSettings[CodingKeys.timeFormat.rawValue] as? String
262+
startOfWeek = rawSettings[CodingKeys.startOfWeek.rawValue] as? String
263+
postsPerPage = rawSettings[CodingKeys.postsPerPage.rawValue] as? NSNumber
264+
265+
commentsAllowed = rawSettings[CodingKeys.commentsAllowed.rawValue] as? NSNumber
266+
commentsBlocklistKeys = rawSettings[CodingKeys.commentsBlocklistKeys.rawValue] as? String
267+
commentsCloseAutomatically = rawSettings[CodingKeys.commentsCloseAutomatically.rawValue] as? NSNumber
268+
commentsCloseAutomaticallyAfterDays = rawSettings[CodingKeys.commentsCloseAutomaticallyAfterDays.rawValue] as? NSNumber
269+
commentsFromKnownUsersAllowlisted = rawSettings[CodingKeys.commentsKnownUsersAllowlist.rawValue] as? NSNumber
270+
commentsMaximumLinks = rawSettings[CodingKeys.commentsMaxLinks.rawValue] as? NSNumber
271+
commentsModerationKeys = rawSettings[CodingKeys.commentsModerationKeys.rawValue] as? String
272+
commentsPagingEnabled = rawSettings[CodingKeys.commentsPagingEnabled.rawValue] as? NSNumber
273+
commentsPageSize = rawSettings[CodingKeys.commentsPageSize.rawValue] as? NSNumber
274+
commentsRequireManualModeration = rawSettings[CodingKeys.commentsRequireModeration.rawValue] as? NSNumber
275+
commentsRequireNameAndEmail = rawSettings[CodingKeys.commentsRequireNameAndEmail.rawValue] as? NSNumber
276+
commentsRequireRegistration = rawSettings[CodingKeys.commentsRequireRegistration.rawValue] as? NSNumber
277+
commentsSortOrder = rawSettings[CodingKeys.commentsSortOrder.rawValue] as? String
278+
commentsThreadingEnabled = rawSettings[CodingKeys.commentsThreadingEnabled.rawValue] as? NSNumber
279+
commentsThreadingDepth = rawSettings[CodingKeys.commentsThreadingDepth.rawValue] as? NSNumber
280+
pingbackOutboundEnabled = rawSettings[CodingKeys.pingbackOutbound.rawValue] as? NSNumber
281+
pingbackInboundEnabled = rawSettings[CodingKeys.pingbackInbound.rawValue] as? NSNumber
282+
283+
relatedPostsAllowed = rawSettings[CodingKeys.relatedPostsAllowed.rawValue] as? NSNumber
284+
relatedPostsEnabled = rawSettings[CodingKeys.relatedPostsEnabled.rawValue] as? NSNumber
285+
relatedPostsShowHeadline = rawSettings[CodingKeys.relatedPostsShowHeadline.rawValue] as? NSNumber
286+
relatedPostsShowThumbnails = rawSettings[CodingKeys.relatedPostsShowThumbnails.rawValue] as? NSNumber
287+
288+
ampSupported = rawSettings[CodingKeys.ampSupported.rawValue] as? NSNumber
289+
ampEnabled = rawSettings[CodingKeys.ampEnabled.rawValue] as? NSNumber
290+
291+
sharingButtonStyle = rawSettings[CodingKeys.sharingButtonStyle.rawValue] as? String
292+
sharingLabel = rawSettings[CodingKeys.sharingLabel.rawValue] as? String
293+
sharingTwitterName = rawSettings[CodingKeys.sharingTwitterName.rawValue] as? String
294+
sharingCommentLikesEnabled = rawSettings[CodingKeys.sharingCommentLikesEnabled.rawValue] as? NSNumber
295+
sharingDisabledLikes = rawSettings[CodingKeys.sharingDisabledLikes.rawValue] as? NSNumber
296+
sharingDisabledReblogs = rawSettings[CodingKeys.sharingDisabledReblogs.rawValue] as? NSNumber
295297
}
296298

297299
@objc
298-
public var dictionaryRepresentation: NSDictionary {
299-
let parameters = NSMutableDictionary()
300+
public var dictionaryRepresentation: [String: Any] {
301+
var parameters: [String: Any] = [:]
300302

301303
// name and tagline/description use different keys...
302-
name.ifSome { parameters.setValue($0, forKey: "blogname") }
303-
tagline.ifSome { parameters.setValue($0, forKey: "blogdescription") }
304-
305-
privacy.ifSome { parameters.setValue($0, forKey: CodingKeys.privacy.rawValue) }
306-
languageID.ifSome { parameters.setValue($0, forKey: CodingKeys.languageID.rawValue) }
307-
iconMediaID.ifSome { parameters.setValue($0, forKey: CodingKeys.iconMediaID.rawValue) }
308-
gmtOffset.ifSome { parameters.setValue($0, forKey: CodingKeys.gmtOffset.rawValue) }
309-
timezoneString.ifSome { parameters.setValue($0, forKey: CodingKeys.timezoneString.rawValue) }
310-
311-
defaultCategoryID.ifSome { parameters.setValue($0, forKey: CodingKeys.defaultCategory.rawValue) }
312-
defaultPostFormat.ifSome { parameters.setValue($0, forKey: CodingKeys.defaultPostFormat.rawValue) }
313-
dateFormat.ifSome { parameters.setValue($0, forKey: CodingKeys.dateFormat.rawValue) }
314-
timeFormat.ifSome { parameters.setValue($0, forKey: CodingKeys.timeFormat.rawValue) }
315-
startOfWeek.ifSome { parameters.setValue($0, forKey: CodingKeys.startOfWeek.rawValue) }
316-
postsPerPage.ifSome { parameters.setValue($0, forKey: CodingKeys.postsPerPage.rawValue) }
317-
318-
commentsAllowed.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsAllowed.rawValue) }
319-
commentsBlocklistKeys.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsBlocklistKeys.rawValue) }
320-
commentsCloseAutomatically.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsCloseAutomatically.rawValue) }
321-
commentsCloseAutomaticallyAfterDays.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsCloseAutomaticallyAfterDays.rawValue) }
322-
commentsFromKnownUsersAllowlisted.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsKnownUsersAllowlist.rawValue) }
323-
commentsMaximumLinks.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsMaxLinks.rawValue) }
324-
commentsModerationKeys.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsModerationKeys.rawValue) }
325-
commentsPagingEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsPagingEnabled.rawValue) }
326-
commentsPageSize.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsPageSize.rawValue) }
327-
commentsRequireManualModeration.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsRequireModeration.rawValue) }
328-
commentsRequireNameAndEmail.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsRequireNameAndEmail.rawValue) }
329-
commentsRequireRegistration.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsRequireRegistration.rawValue) }
330-
commentsSortOrder.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsSortOrder.rawValue) }
331-
commentsThreadingEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsThreadingEnabled.rawValue) }
332-
commentsThreadingDepth.ifSome { parameters.setValue($0, forKey: CodingKeys.commentsThreadingDepth.rawValue) }
333-
334-
pingbackOutboundEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.pingbackOutbound.rawValue) }
335-
pingbackInboundEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.pingbackInbound.rawValue) }
304+
parameters["blogname"] = name
305+
parameters["blogdescription"] = tagline
306+
307+
parameters[CodingKeys.privacy.rawValue] = privacy
308+
parameters[CodingKeys.languageID.rawValue] = languageID
309+
parameters[CodingKeys.iconMediaID.rawValue] = iconMediaID
310+
parameters[CodingKeys.gmtOffset.rawValue] = gmtOffset
311+
parameters[CodingKeys.timezoneString.rawValue] = timezoneString
312+
313+
parameters[CodingKeys.defaultCategory.rawValue] = defaultCategoryID
314+
parameters[CodingKeys.defaultPostFormat.rawValue] = defaultPostFormat
315+
parameters[CodingKeys.dateFormat.rawValue] = dateFormat
316+
parameters[CodingKeys.timeFormat.rawValue] = timeFormat
317+
parameters[CodingKeys.startOfWeek.rawValue] = startOfWeek
318+
parameters[CodingKeys.postsPerPage.rawValue] = postsPerPage
319+
320+
parameters[CodingKeys.commentsAllowed.rawValue] = commentsAllowed
321+
parameters[CodingKeys.commentsBlocklistKeys.rawValue] = commentsBlocklistKeys
322+
parameters[CodingKeys.commentsCloseAutomatically.rawValue] = commentsCloseAutomatically
323+
parameters[CodingKeys.commentsCloseAutomaticallyAfterDays.rawValue] = commentsCloseAutomaticallyAfterDays
324+
parameters[CodingKeys.commentsKnownUsersAllowlist.rawValue] = commentsFromKnownUsersAllowlisted
325+
parameters[CodingKeys.commentsMaxLinks.rawValue] = commentsMaximumLinks
326+
parameters[CodingKeys.commentsModerationKeys.rawValue] = commentsModerationKeys
327+
parameters[CodingKeys.commentsPagingEnabled.rawValue] = commentsPagingEnabled
328+
parameters[CodingKeys.commentsPageSize.rawValue] = commentsPageSize
329+
parameters[CodingKeys.commentsRequireModeration.rawValue] = commentsRequireManualModeration
330+
parameters[CodingKeys.commentsRequireNameAndEmail.rawValue] = commentsRequireNameAndEmail
331+
parameters[CodingKeys.commentsRequireRegistration.rawValue] = commentsRequireRegistration
332+
parameters[CodingKeys.commentsSortOrder.rawValue] = commentsSortOrder
333+
parameters[CodingKeys.commentsThreadingEnabled.rawValue] = commentsThreadingEnabled
334+
parameters[CodingKeys.commentsThreadingDepth.rawValue] = commentsThreadingDepth
335+
336+
parameters[CodingKeys.pingbackOutbound.rawValue] = pingbackOutboundEnabled
337+
parameters[CodingKeys.pingbackInbound.rawValue] = pingbackInboundEnabled
336338

337339
// Note: releatedPostsAllowed was not set in the Objective-C implementation.
338340
// There was no comment about it, so I assumed it was simply something that was never noticed.
339-
relatedPostsAllowed.ifSome { parameters.setValue($0, forKey: CodingKeys.relatedPostsAllowed.rawValue) }
340-
relatedPostsEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.relatedPostsEnabled.rawValue) }
341-
relatedPostsShowHeadline.ifSome { parameters.setValue($0, forKey: CodingKeys.relatedPostsShowHeadline.rawValue) }
342-
relatedPostsShowThumbnails.ifSome { parameters.setValue($0, forKey: CodingKeys.relatedPostsShowThumbnails.rawValue) }
341+
parameters[CodingKeys.relatedPostsAllowed.rawValue] = relatedPostsAllowed
342+
parameters[CodingKeys.relatedPostsEnabled.rawValue] = relatedPostsEnabled
343+
parameters[CodingKeys.relatedPostsShowHeadline.rawValue] = relatedPostsShowHeadline
344+
parameters[CodingKeys.relatedPostsShowThumbnails.rawValue] = relatedPostsShowThumbnails
343345

344346
// Note: ampSupported was not set in the Objective-C implementation.
345347
// There was no comment about it, so I assumed it was simply something that was never noticed.
346-
ampSupported.ifSome { parameters.setValue($0, forKey: CodingKeys.ampSupported.rawValue) }
347-
ampEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.ampEnabled.rawValue) }
348+
parameters[CodingKeys.ampSupported.rawValue] = ampSupported
349+
parameters[CodingKeys.ampEnabled.rawValue] = ampEnabled
348350

349-
sharingButtonStyle.ifSome { parameters.setValue($0, forKey: CodingKeys.sharingButtonStyle.rawValue) }
350-
sharingLabel.ifSome { parameters.setValue($0, forKey: CodingKeys.sharingLabel.rawValue) }
351-
sharingTwitterName.ifSome { parameters.setValue($0, forKey: CodingKeys.sharingTwitterName.rawValue) }
352-
sharingCommentLikesEnabled.ifSome { parameters.setValue($0, forKey: CodingKeys.sharingCommentLikesEnabled.rawValue) }
353-
sharingDisabledLikes.ifSome { parameters.setValue($0, forKey: CodingKeys.sharingDisabledLikes.rawValue) }
354-
sharingDisabledReblogs.ifSome { parameters.setValue($0, forKey: CodingKeys.sharingDisabledReblogs.rawValue) }
351+
parameters[CodingKeys.sharingButtonStyle.rawValue] = sharingButtonStyle
352+
parameters[CodingKeys.sharingLabel.rawValue] = sharingLabel
353+
parameters[CodingKeys.sharingTwitterName.rawValue] = sharingTwitterName
354+
parameters[CodingKeys.sharingCommentLikesEnabled.rawValue] = sharingCommentLikesEnabled
355+
parameters[CodingKeys.sharingDisabledLikes.rawValue] = sharingDisabledLikes
356+
parameters[CodingKeys.sharingDisabledReblogs.rawValue] = sharingDisabledReblogs
355357

356358
return parameters
357359
}
@@ -375,11 +377,19 @@ public class RemoteBlogSettings: NSObject {
375377
private static let DescendingStringValue = "desc"
376378
}
377379

378-
private extension Optional {
380+
extension Dictionary where Key == String {
379381

380-
func ifSome(_ body: (Wrapped) -> Void) {
381-
guard case .some(let value) = self else { return }
382+
func number(forKey key: String) -> NSNumber? {
383+
guard let value = self[key] else { return .none }
382384

383-
body(value)
385+
if let value = value as? NSNumber {
386+
return value
387+
} else if let value = value as? String {
388+
let numberFormatter = NumberFormatter()
389+
numberFormatter.numberStyle = .none
390+
return numberFormatter.number(from: value)
391+
} else {
392+
return .none
393+
}
384394
}
385395
}

0 commit comments

Comments
 (0)