Выберите среднее значение в массиве - Swift - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь убедиться, что списки со средним значением - это первое представление, которое появляется при создании моего приложения. Xcode предлагает if let firstView = viewList.first и if let firstView = viewList.last, но я не могу понять, как выбрать среднее значение.

lazy var viewList:[UIViewController] = {
    let sb = UIStoryboard(name: "Main", bundle: nil)

    let lists = sb.instantiateViewController(withIdentifier: "Lists")
    let reminders = sb.instantiateViewController(withIdentifier: "Reminders")
    let todo = sb.instantiateViewController(withIdentifier: "To Do")

    return [reminders, lists, todo]
}()

override func viewDidLoad() {
    super.viewDidLoad()

    self.dataSource = self

    if let firstView = viewList.first {
        self.setViewControllers([firstView], direction: .forward, animated: true, completion: nil)
    }
}

Ответы [ 4 ]

0 голосов
/ 03 июля 2019

Можно добавить расширение к Array, чтобы выполнить это:

extension Array {

    var middleIndex: Int {
        return (self.isEmpty ? self.startIndex : self.count - 1) / 2
    }
}
let myArray: [String] = ["Hello", "World", "!"]
print("myArray.middleIndex: \(myArray.middleIndex)") // prints 1
0 голосов
/ 09 мая 2018

Подобно first и last, вы можете расширить Array вычисленным свойством middle, которое возвращает необязательное Element.

extension Array {

    var middle: Element? {
        guard count != 0 else { return nil }

        let middleIndex = (count > 1 ? count - 1 : count) / 2
        return self[middleIndex]
    }

}

Пример использования:

if let middleView = viewList.middle {
    //... Do something
}

Я хочу, чтобы вы знали, что first и last могут возвращать один и тот же элемент, если массив содержит только 1 элемент.

Аналогично, хотя это расширение будет работать для любой длины массива, оно может возвращать тот же элемент для:

  • first, middle & last, если в вашем массиве только 1 элемент
  • middle & last, если в вашем массиве только 2 элемента
0 голосов
/ 09 мая 2018

Поскольку viewList объявлено как [UIViewController] (не как опционально - [UIViewController?]), вам не нужно "необязательное связывание" (проверка, является ли элемент nil или нет), потому что оно должен существовать . вместо этого вам следует проверить, находится ли индекс в диапазоне (убедившись, что индекс находится в диапазоне).

По логике (очевидно), если вы уверены, что viewList всегда имеет 3 элемента, вам не нужно выполнять какую-либо проверку, просто:

let middleViewController = viewList[1]

Если число элементов в viewList не определено и вы стремитесь получить средний элемент, вы просто получаете его как:

let middleViewController = viewList[(viewList.count - 1) / 2]

Помните, first и last являются опциональными, в вашем случае нет необходимости работать с опциональными ...

0 голосов
/ 09 мая 2018

Ваш viewList является массивом типа UIViewController. И first и last обозначает только их 0-й и последний индекс. как:

viewList.first совпадает с viewList[0]

viewList.last совпадает с viewList[viewList.count - 1]

Единственная разница в их использовании заключается в том, что если вы будете использовать viewList.first, он вернет nil, если ваш массив пуст, но если вы будете использовать viewList[0] для пустого массива, ваше приложение будет аварийно завершать работу с ошибкой индекс вне границ ...

Таким образом, вы можете легко получить доступ к своему среднему значению с помощью индекса:

if viewList.count > 1 {
    let middleView = viewList[1]
    self.setViewControllers([middleView], direction: .forward, animated: true, completion: nil)
}

Если вы не уверены, что viewList.count будет 3 или более, то:

    let middleIndex = (viewList.count - 1) / 2
    let middleView = viewList[middleIndex]
...