Ответ 1
Если набор операций, применяемых ко всем элементам массива, можно заменить for-loop закрытием forEach{}
и использовать необязательную цепочку:
var arr: [Int]? = [1, 2, 3]
arr?.forEach{print($0)}
Каков правильный способ использования цикла for-in с дополнительным?
Прямо сейчас я всегда выполняю необязательное связывание перед его циклом. Существуют ли другие идиомы?
let optionalInt:[Int]? = [1, 2, 3]
if let optionalInt = optionalInt {
for i in optionalInt {
print(i)
}
}
Если набор операций, применяемых ко всем элементам массива, можно заменить for-loop закрытием forEach{}
и использовать необязательную цепочку:
var arr: [Int]? = [1, 2, 3]
arr?.forEach{print($0)}
Я не думаю, что там правильный путь. Есть много разных способов, это действительно сводится к тому, что вы предпочитаете, Swift полон функций, которые могут сделать вашу программу очень приятной в соответствии с вашим выбором.
Вот несколько способов, о которых я мог подумать:
let optionalInt:[Int]? = [1, 2, 3]
for i in optionalInt! { print(i) }
for i in optionalInt ?? [] { print(i) }
for i in optionalInt as [Int]! { print(i) }
Вы можете написать это:
let optionalInt:[Int]? = [1, 2, 3]
for i in optionalInt ?? [Int]() {
print(i)
}
Но я бы рекомендовал вам не использовать необязательное значение, например, вы можете написать вот так:
var values = [Int]()
// now you may set or may not set
for i in values {
print(i)
}
Или, если вы хотите использовать необязательное значение, и эти кодовые вызовы в функции могут использовать guard
:
guard let values = optionalInt else { return }
for i in values {
print(i)
}
Я опаздываю на два года, но думаю, что это лучший способ.
func maybe<T>(risk: T?, backup: T) -> T {
return risk.maybe(backup)
}
и
extension Optional {
func maybe(_ backup: Wrapped) -> Wrapped {
switch self {
case let .some(val):
return val
case .none:
return backup
}
}
}
и теперь
for i in optionalInt.maybe([]) {
print(i)
}
В соответствии с документацией Apple вы можете сделать это:
let arrayOfOptionalInts: [Int?] = [nil, 2, 3, nil, 5]
// Match only non-nil values
for case let number? in arrayOfOptionalInts {
print("Found a \(number)")
}
Вот ссылка на Дополнительные шаблоны: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Patterns.html#//apple_ref/doc/uid/TP40014097-CH36-ID520