@Abizern прибивает его для случаев, когда вам нужна полная мощность if case let
. Там вы с ситуациями, когда вы этого не сделаете, например, с картографирования опциями или с помощью ReactiveCocoa, в этом случае старый хороший кастинг приходит на помощь, особенно если вам нужны все значения и кортежи не особенно долго:
import ReactiveCocoa
import ReactiveSwift
typealias Credentials = (u: String?, p: String?)
var notification = Notification.Name("didReceiveCredentials")
var c1: Credentials? = ("foo", "bar")
var c2: Credentials? = ("foo", nil)
print("cast:", c1.flatMap({ $0 as? (String, String) }))
print("cast:", c2.flatMap({ $0 as? (String, String) }))
if let (u, p) = c1 as? (String, String) { print("if:", u, p) }
if let (u, p) = c2 as? (String, String) { print("if:", u, p) }
NotificationCenter.default.reactive.notifications(forName: notification)
.filterMap({ $0.object as? Credentials })
.filterMap({ $0 as? (String, String) })
.observeValues({ print("signal:", $0) })
NotificationCenter.default.post(name: notification, object: c1)
NotificationCenter.default.post(name: notification, object: c2)
Обсуждаются темы с сопоставлением кортежей в Swift, и вы можете проверить http://stackoverflow.com/questions/24487519/how-to-elegantly-compare-tuples-in-swift – TimeString