2016-01-13 3 views
2

бит дилеммы о кодировании стиль в Swift:Swift: раннее возвращение, если оба варианта равны нулю?

Скажем у нас есть 2 переменные, которые оба могут быть нулевыми (ОПЦИИ), и мы должны получить значение одного из них или вернуться рано, если оба равны нулю.

В Objective-C было бы написано так:

- (void)authenticate:(Account*)anAccount { 
    Account* account = anAccount ?: self.defaultAccount(); 
    if (!account) return; 

    doLotsOfThings(account); 
} 

я мог бы выяснить несколько способов переписать его в Swift, но все они введены код запах.

Swift: с кодом дублирования

func authenticate(_account: Account?) { 
    if let account = _account { 
    self.doLotsOfThings(account) 
    } else if let account = self.defaultAccount { 
    self.doLotsOfThings(account) 
    } 
} 

Swift: это решает дублирования кода, но не чувствует себя очень Swift-у.

func authenticate(_account: Account?) { 
    if _account == nil && self.defaultAccount == nil { return } 
    let account = _account == nil ? self.defaultAccount! : _account! 

    self.doLotsOfThings(account) 
} 

Вопрос есть; есть ли способ сделать это, используя guard? Если нет, есть ли более эффективные способы борьбы с этим делом?

Спасибо.

ответ

4

Это вариант использования для ноль-коалесцирующем оператора ??:

func authenticate(_account: Account?) { 
    if let account = _account ?? self.defaultAccount { 
    self.doLotsOfThings(account) 
    } 
} 

или раннего возвращения с guard:

func authenticate(_account: Account?) { 
    guard let account = _account ?? self.defaultAccount else { 
    return 
    } 
    self.doLotsOfThings(account) 
} 

Выражение

_account ?? self.defaultAccount 

вычисляет _account если _account != nil, и до self.defaultAccount в противном случае.

?? Также является «короткое замыкание» оператор как && и ||, это означает, что в вашем случае , self.defaultAccount даже не вычисляется, если _account != nil.