Самое сложное требование, которое также не удовлетворяется принятым ответом :
Вместо инициализации, подобной приведенной ниже, я бы предпочел иметьсвойство списка Foos: [Bar], которое может содержать 1 или 2 элемента.
Одним из способов решения этой проблемы может быть пользовательская ошибка времени выполнения.
enum BarWrapperError: Error {
case emptyList
}
Для передачисписок и проверить, если он хотя бы содержит один элемент, вы можете ввести другой тип
struct BarWrapper {
init(bars: [Bar]) throws {
guard bars.count > 0 else {
throw BarWrapperError.emptyList
}
self.bars = bars
}
let bars: [Bar]
var firstBar: Bar {
return bars[0]
}
var otherBars:[Bar] {
return Array(bars[1 ..< bars.count])
}
}
BarWrapper
инициализируется со списком баров.Если этот список пуст, он выдаст ошибку.
ваш MyClass
теперь будет выглядеть так:
class MyClass {
let name: String
let firstBar: Bar
let otherBars: [Bar]
init(name: String, barWrapper: BarWrapper) {
self.name = name
self.firstBar = barWrapper.firstBar
self.otherBars = barWrapper.otherBars
}
}
Если вы заботитесь об ошибке и хотите продолжить выполнение, выВы можете использовать это как
do {
let bar0 = Bar()
let bar1 = Bar()
let barWrapper = try BarWrapper(bars: [bar0, bar1])
let object = MyClass(name: "String", barWrapper: barWrapper)
print(object.otherBars)
} catch BarWrapperError.emptyList {
print("empty bar list")
}
Если вы хотите завершить работу приложения, если список пуст, вы можете сократить его до
let bar0 = Bar()
let bar1 = Bar()
let barWrapper = try! BarWrapper(bars: [bar0, bar1])
let object = MyClass(name: "String", barWrapper: barWrapper)
print(object.otherBars)
, используя try!
Вы также можете сделать
let bar0 = Bar()
let bar1 = Bar()
if let barWrapper = try? BarWrapper(bars: [bar0, bar1]) {
let object = MyClass(name: "String", barWrapper: barWrapper)
print(object.otherBars)
}
, если вам не нужна обработка ошибок, и ваше приложение будет работать, если экземпляр MyClass
не создан.