Skip to content

Commit 570b3e7

Browse files
Merge pull request #322 from pusher/feature/321-guard-let
Refactor some 'if let' statments to 'guard let'
2 parents 6551342 + cb54cc8 commit 570b3e7

11 files changed

+231
-167
lines changed

Sources/Models/PusherChannel.swift

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,11 @@ open class PusherChannel: NSObject {
128128
- parameter callbackId: The unique callbackId string used to identify which callback to unbind
129129
*/
130130
open func unbind(eventName: String, callbackId: String) {
131-
if let eventSpecificHandlers = self.eventHandlers[eventName] {
132-
self.eventHandlers[eventName] = eventSpecificHandlers.filter({ $0.id != callbackId })
131+
guard let eventSpecificHandlers = self.eventHandlers[eventName] else {
132+
return
133133
}
134+
135+
self.eventHandlers[eventName] = eventSpecificHandlers.filter({ $0.id != callbackId })
134136
}
135137

136138
/**
@@ -155,11 +157,13 @@ open class PusherChannel: NSObject {
155157
- parameter event: The event received from the websocket
156158
*/
157159
open func handleEvent(event: PusherEvent) {
158-
if let eventHandlerArray = self.eventHandlers[event.eventName] {
159-
for eventHandler in eventHandlerArray {
160-
// swiftlint:disable:next force_cast
161-
eventHandler.callback(event.copy() as! PusherEvent)
162-
}
160+
guard let eventHandlerArray = self.eventHandlers[event.eventName] else {
161+
return
162+
}
163+
164+
for eventHandler in eventHandlerArray {
165+
// swiftlint:disable:next force_cast
166+
eventHandler.callback(event.copy() as! PusherEvent)
163167
}
164168
}
165169

Sources/Models/PusherPresenceChannel.swift

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,13 @@ public typealias PusherUserInfoObject = [String: AnyObject]
101101
id = String.init(describing: memberJSON[Constants.JSONKeys.userId]!)
102102
}
103103

104-
if let index = self.members.firstIndex(where: { $0.userId == id }) {
105-
let member = self.members[index]
106-
self.members.remove(at: index)
107-
self.onMemberRemoved?(member)
104+
guard let index = self.members.firstIndex(where: { $0.userId == id }) else {
105+
return
108106
}
107+
108+
let member = self.members[index]
109+
self.members.remove(at: index)
110+
self.onMemberRemoved?(member)
109111
}
110112

111113
/**
@@ -116,10 +118,12 @@ public typealias PusherUserInfoObject = [String: AnyObject]
116118
to the channel
117119
*/
118120
internal func setMyUserId(channelData: String) {
119-
if let channelDataObject = parse(channelData: channelData),
120-
let userId = channelDataObject[Constants.JSONKeys.userId] {
121-
self.myId = String.init(describing: userId)
121+
guard let channelDataObject = parse(channelData: channelData),
122+
let userId = channelDataObject[Constants.JSONKeys.userId] else {
123+
return
122124
}
125+
126+
self.myId = String.init(describing: userId)
123127
}
124128

125129
/**
@@ -166,11 +170,11 @@ public typealias PusherUserInfoObject = [String: AnyObject]
166170
- returns: The connected user's PusherPresenceChannelMember object
167171
*/
168172
open func me() -> PusherPresenceChannelMember? {
169-
if let id = self.myId {
170-
return findMember(userId: id)
171-
} else {
173+
guard let id = self.myId else {
172174
return nil
173175
}
176+
177+
return findMember(userId: id)
174178
}
175179
}
176180

Sources/ObjC/ObjectiveC.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,10 @@ public extension AuthMethod {
215215
public extension PusherError {
216216
/// The error code as an NSNumber (for Objective-C compatibility).
217217
var codeOC: NSNumber? {
218-
if let code = code {
219-
return NSNumber(value: code)
220-
} else {
218+
guard let code = code else {
221219
return nil
222220
}
221+
222+
return NSNumber(value: code)
223223
}
224224
}

Sources/Services/PusherConnection.swift

Lines changed: 96 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -167,15 +167,17 @@ import NWWebSocket
167167
- parameter channelName: The name of the channel
168168
*/
169169
internal func unsubscribe(channelName: String) {
170-
if let chan = self.channels.find(name: channelName), chan.subscribed {
171-
self.sendEvent(event: Constants.Events.Pusher.unsubscribe,
172-
data: [
173-
Constants.JSONKeys.channel: channelName
174-
] as [String: Any]
175-
)
176-
177-
self.channels.remove(name: channelName)
170+
guard let chan = self.channels.find(name: channelName), chan.subscribed else {
171+
return
178172
}
173+
174+
self.sendEvent(event: Constants.Events.Pusher.unsubscribe,
175+
data: [
176+
Constants.JSONKeys.channel: channelName
177+
] as [String: Any]
178+
)
179+
180+
self.channels.remove(name: channelName)
179181
}
180182

181183
/**
@@ -216,17 +218,19 @@ import NWWebSocket
216218
- parameter channel: The name of the channel
217219
*/
218220
fileprivate func sendClientEvent(event: String, data: Any, channel: PusherChannel?) {
219-
if let channel = channel {
220-
if channel.type == .presence || channel.type == .private {
221-
let dataString = JSONStringify([Constants.JSONKeys.event: event,
222-
Constants.JSONKeys.data: data,
223-
Constants.JSONKeys.channel: channel.name] as [String: Any])
224-
PusherLogger.shared.debug(for: .clientEventSent,
225-
context: dataString)
226-
self.socket.send(string: dataString)
227-
} else {
228-
PusherLogger.shared.debug(for: .cannotSendClientEventForChannel)
229-
}
221+
guard let channel = channel else {
222+
return
223+
}
224+
225+
if channel.type == .presence || channel.type == .private {
226+
let dataString = JSONStringify([Constants.JSONKeys.event: event,
227+
Constants.JSONKeys.data: data,
228+
Constants.JSONKeys.channel: channel.name] as [String: Any])
229+
PusherLogger.shared.debug(for: .clientEventSent,
230+
context: dataString)
231+
self.socket.send(string: dataString)
232+
} else {
233+
PusherLogger.shared.debug(for: .cannotSendClientEventForChannel)
230234
}
231235
}
232236

@@ -440,36 +444,39 @@ import NWWebSocket
440444
- parameter json: The PusherEventJSON containing successful subscription data
441445
*/
442446
fileprivate func handleSubscriptionSucceededEvent(event: PusherEvent) {
443-
if let channelName = event.channelName, let chan = self.channels.find(name: channelName) {
444-
chan.subscribed = true
447+
guard let channelName = event.channelName,
448+
let chan = self.channels.find(name: channelName) else {
449+
return
450+
}
445451

446-
guard event.data != nil else {
447-
PusherLogger.shared.debug(for: .subscriptionSucceededNoDataInPayload)
448-
return
449-
}
452+
chan.subscribed = true
450453

451-
if PusherChannelType.isPresenceChannel(name: channelName) {
452-
if let presChan = self.channels.find(name: channelName) as? PusherPresenceChannel {
453-
if let dataJSON = event.dataToJSONObject() as? [String: Any],
454-
let presenceData = dataJSON[Constants.JSONKeys.presence] as? [String: AnyObject],
455-
let presenceHash = presenceData[Constants.JSONKeys.hash] as? [String: AnyObject] {
456-
presChan.addExistingMembers(memberHash: presenceHash)
457-
}
454+
guard event.data != nil else {
455+
PusherLogger.shared.debug(for: .subscriptionSucceededNoDataInPayload)
456+
return
457+
}
458+
459+
if PusherChannelType.isPresenceChannel(name: channelName) {
460+
if let presChan = self.channels.find(name: channelName) as? PusherPresenceChannel {
461+
if let dataJSON = event.dataToJSONObject() as? [String: Any],
462+
let presenceData = dataJSON[Constants.JSONKeys.presence] as? [String: AnyObject],
463+
let presenceHash = presenceData[Constants.JSONKeys.hash] as? [String: AnyObject] {
464+
presChan.addExistingMembers(memberHash: presenceHash)
458465
}
459466
}
467+
}
460468

461-
let subscriptionEvent = event.copy(withEventName: Constants.Events.Pusher.subscriptionSucceeded)
462-
callGlobalCallbacks(event: subscriptionEvent)
463-
chan.handleEvent(event: subscriptionEvent)
469+
let subscriptionEvent = event.copy(withEventName: Constants.Events.Pusher.subscriptionSucceeded)
470+
callGlobalCallbacks(event: subscriptionEvent)
471+
chan.handleEvent(event: subscriptionEvent)
464472

465-
self.delegate?.subscribedToChannel?(name: channelName)
473+
self.delegate?.subscribedToChannel?(name: channelName)
466474

467-
chan.auth = nil
475+
chan.auth = nil
468476

469-
while chan.unsentEvents.count > 0 {
470-
if let pusherEvent = chan.unsentEvents.popLast() {
471-
chan.trigger(eventName: pusherEvent.name, data: pusherEvent.data)
472-
}
477+
while chan.unsentEvents.count > 0 {
478+
if let pusherEvent = chan.unsentEvents.popLast() {
479+
chan.trigger(eventName: pusherEvent.name, data: pusherEvent.data)
473480
}
474481
}
475482
}
@@ -481,21 +488,23 @@ import NWWebSocket
481488
- parameter event: The event to be processed
482489
*/
483490
fileprivate func handleConnectionEstablishedEvent(event: PusherEvent) {
484-
if let connectionData = event.dataToJSONObject() as? [String: Any],
485-
let socketId = connectionData[Constants.JSONKeys.socketId] as? String {
486-
self.socketId = socketId
487-
PusherLogger.shared.debug(for: .connectionEstablished,
488-
context: socketId)
489-
self.reconnectAttempts = 0
490-
self.reconnectTimer?.invalidate()
491-
492-
if options.activityTimeout == nil,
493-
let activityTimeoutFromServer = connectionData["activity_timeout"] as? TimeInterval {
494-
self.activityTimeoutInterval = activityTimeoutFromServer
495-
}
491+
guard let connectionData = event.dataToJSONObject() as? [String: Any],
492+
let socketId = connectionData[Constants.JSONKeys.socketId] as? String else {
493+
return
494+
}
495+
496+
self.socketId = socketId
497+
PusherLogger.shared.debug(for: .connectionEstablished,
498+
context: socketId)
499+
self.reconnectAttempts = 0
500+
self.reconnectTimer?.invalidate()
496501

497-
self.connectionEstablishedMessageReceived = true
502+
if options.activityTimeout == nil,
503+
let activityTimeoutFromServer = connectionData["activity_timeout"] as? TimeInterval {
504+
self.activityTimeoutInterval = activityTimeoutFromServer
498505
}
506+
507+
self.connectionEstablishedMessageReceived = true
499508
}
500509

501510
/**
@@ -517,13 +526,15 @@ import NWWebSocket
517526
- parameter event: The event to be processed
518527
*/
519528
fileprivate func handleMemberAddedEvent(event: PusherEvent) {
520-
if let channelName = event.channelName,
521-
let chan = self.channels.find(name: channelName) as? PusherPresenceChannel {
522-
if let memberJSON = event.dataToJSONObject() as? [String: Any] {
523-
chan.addMember(memberJSON: memberJSON)
524-
} else {
525-
PusherLogger.shared.debug(for: .unableToAddMemberToChannel)
526-
}
529+
guard let channelName = event.channelName,
530+
let chan = self.channels.find(name: channelName) as? PusherPresenceChannel else {
531+
return
532+
}
533+
534+
if let memberJSON = event.dataToJSONObject() as? [String: Any] {
535+
chan.addMember(memberJSON: memberJSON)
536+
} else {
537+
PusherLogger.shared.debug(for: .unableToAddMemberToChannel)
527538
}
528539
}
529540

@@ -533,13 +544,15 @@ import NWWebSocket
533544
- parameter event: The event to be processed
534545
*/
535546
fileprivate func handleMemberRemovedEvent(event: PusherEvent) {
536-
if let channelName = event.channelName,
537-
let chan = self.channels.find(name: channelName) as? PusherPresenceChannel {
538-
if let memberJSON = event.dataToJSONObject() as? [String: Any] {
539-
chan.removeMember(memberJSON: memberJSON)
540-
} else {
541-
PusherLogger.shared.debug(for: .unableToRemoveMemberFromChannel)
542-
}
547+
guard let channelName = event.channelName,
548+
let chan = self.channels.find(name: channelName) as? PusherPresenceChannel else {
549+
return
550+
}
551+
552+
if let memberJSON = event.dataToJSONObject() as? [String: Any] {
553+
chan.removeMember(memberJSON: memberJSON)
554+
} else {
555+
PusherLogger.shared.debug(for: .unableToRemoveMemberFromChannel)
543556
}
544557
}
545558

@@ -567,17 +580,19 @@ import NWWebSocket
567580
Constants.JSONKeys.channel: channelName,
568581
Constants.JSONKeys.data: error.data ?? ""
569582
]
570-
if let event = try? self.eventFactory.makeEvent(fromJSON: json, withDecryptionKey: nil) {
571-
DispatchQueue.main.async {
572-
// TODO: Consider removing in favour of exclusively using delegate
573-
self.handleEvent(event: event)
574-
}
583+
guard let event = try? self.eventFactory.makeEvent(fromJSON: json, withDecryptionKey: nil) else {
584+
return
585+
}
575586

576-
self.delegate?.failedToSubscribeToChannel?(name: channelName,
577-
response: error.response,
578-
data: error.data,
579-
error: error.error)
587+
DispatchQueue.main.async {
588+
// TODO: Consider removing in favour of exclusively using delegate
589+
self.handleEvent(event: event)
580590
}
591+
592+
self.delegate?.failedToSubscribeToChannel?(name: channelName,
593+
response: error.response,
594+
data: error.data,
595+
error: error.error)
581596
}
582597

583598
/**
@@ -598,9 +613,11 @@ import NWWebSocket
598613
handleMemberRemovedEvent(event: event)
599614
default:
600615
callGlobalCallbacks(event: event)
601-
if let channelName = event.channelName, let internalChannel = self.channels.find(name: channelName) {
602-
internalChannel.handleEvent(event: event)
616+
guard let channelName = event.channelName,
617+
let internalChannel = self.channels.find(name: channelName) else {
618+
return
603619
}
620+
internalChannel.handleEvent(event: event)
604621
}
605622
}
606623

Sources/Services/PusherEventQueue.swift

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,21 +53,25 @@ class PusherConcreteEventQueue: PusherEventQueue {
5353
} catch PusherEventError.invalidDecryptionKey {
5454
// Reload decryption key if we could not decrypt the payload due to the key
5555
// Only events on encrypted channels throw this error, which have a channel
56-
if let channel = channel {
57-
self.delegate?.eventQueue(self, reloadDecryptionKeySyncForChannel: channel)
58-
do {
59-
try self.processEvent(json: json, channel: channel)
60-
} catch {
61-
self.delegate?.eventQueue(self,
62-
didFailToDecryptEventWithPayload: json,
63-
forChannelName: channel.name)
64-
}
56+
guard let channel = channel else {
57+
return
58+
}
59+
60+
self.delegate?.eventQueue(self, reloadDecryptionKeySyncForChannel: channel)
61+
do {
62+
try self.processEvent(json: json, channel: channel)
63+
} catch {
64+
self.delegate?.eventQueue(self,
65+
didFailToDecryptEventWithPayload: json,
66+
forChannelName: channel.name)
6567
}
6668
} catch PusherEventError.invalidEncryptedData {
6769
// If there was a problem with the payload, e.g. nonce missing, then we cannot retry
68-
if let channelName = channel?.name {
69-
self.delegate?.eventQueue(self, didFailToDecryptEventWithPayload: json, forChannelName: channelName)
70+
guard let channelName = channel?.name else {
71+
return
7072
}
73+
74+
self.delegate?.eventQueue(self, didFailToDecryptEventWithPayload: json, forChannelName: channelName)
7175
} catch {
7276
self.delegate?.eventQueue(self, didReceiveInvalidEventWithPayload: json)
7377
}

0 commit comments

Comments
 (0)