2015-04-04 3 views
4

Я хотел бы узнать, есть ли у кого более элегантный способ проверить, либо значений в Tuple - это Nil in Swift?Элегантный способ проверить, нет ли ни одного значения в Tuple

В настоящее время я проверяю так:

var credentials = CredentialHelper.getCredentials() //returns a tuple of two Optional Strings. 

    if (credentials.username == nil || credentials.password == nil) 
    { 
     //continue doing work. 
    } 

Я хотел бы что-то более емким, если это возможно.

+0

Обсуждаются темы с сопоставлением кортежей в Swift, и вы можете проверить http://stackoverflow.com/questions/24487519/how-to-elegantly-compare-tuples-in-swift – TimeString

ответ

4

Вы можете сделать это с помощью корпуса коммутатора по значениям кортежа. Например:

func testTuple(input: (String?, String?)) -> String { 
    switch input { 
    case (_, .None), (.None, _): 
     return "One or the other is nil" 
    case (.Some(let a), _): 
     return "a is \(a)" 
    case (_, .Some(let b)): 
     return "b is \(b)" 
    } 
} 

testTuple((nil, "B")) // "One or the other is nil" 
testTuple(("A", nil)) // "One or the other is nil" 
testTuple(("A", "B")) // "a is A" 
testTuple((nil, nil)) // "One or the other is nil" 

Хитрость заключается в использовании привязок привязки по значениям кортежа.

0

@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) 
Смежные вопросы