我正在尝试确保中间值列表是构建应用程序时看到的第一个视图。 Xcode提供Offset
和Range
,但我无法锻炼如何选择中间值。
RowOffset
答案 0 :(得分:1)
与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
}
我希望您注意,如果数组只有1个元素,first
和last
可以返回相同的元素。
类似地,尽管此扩展适用于任何数组长度,但它可以返回相同的元素:
first
,middle
& last
如果您的数组只有1个元素middle
& last
如果您的数组只有2个元素答案 1 :(得分:1)
由于viewList
被声明为[UIViewController]
(而不是选项 - [UIViewController?]
),因此您不必使用"可选绑定" (检查元素是否为nil
)因为必须存在。你应该做的是检查范围内的索引(确保索引在范围内)。
从逻辑上讲(显然),如果您非常确定viewList
总是有3个元素,则无需进行任何检查,只需:
let middleViewController = viewList[1]
如果viewList
中的元素数量未确定且您的目标是获取中间元素,则只需将其设为:
let middleViewController = viewList[(viewList.count - 1) / 2]
请注意,first
和last
是可选项,在您的情况下,无需使用选项...
答案 2 :(得分:0)
您的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]
答案 3 :(得分:0)
可以为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