gpt4 book ai didi

ios - 如何最好地管理 Swift 中的可选数组?

转载 作者:可可西里 更新时间:2023-11-01 00:40:25 25 4
gpt4 key购买 nike

我希望管理一个可选数组并实现以下行为:

用 nil 初始化为某个常量大小(为简洁起见,将使用通用类型 T):

var myRay = [T?](repeating: nil, count: 5)

所以我们有:[nil, nil, nil, nil, nil]

我想要一个函数从一开始就将项目添加到这个数组中,同时替换 nil 值。在用非 nil 值填充数组后,该函数会将值添加到数组的末尾。

所以如果我们在上面的数组上调用这个函数 7 次,它看起来像这样:

insert(item: T, array: inout [T]?)

x1: [X, nil, nil, nil, nil]
x2: [X, X, nil, nil, nil]
x3: [X, X, X, nil, nil]
x4: [X, X, X, X, nil]
x5: [X, X, X, X, X]
x6: [X, X, X, X, X, X]
x7: [X, X, X, X, X, X, X]

(其中 X 是一个非零值)

我提出了以下有效的解决方案。我把它扔在那里是因为我认为很可能有更好的解决方案,而且我认为这是一个非常有趣的问题,它出现在像 swift 这样具有可选的语​​言中。在下面发布我的解决方案:

private func insertValue<T>(element: T, array: inout [T?]) {
let insertIndex = getFirstNilIndex(fromArray: array)
array.insert(element, at: insertIndex)

if let lastElement = array.last, let _ = lastElement {
// the last element is a non-nil value of type T
} else {
// the last element is nil
array.remove(at: array.endIndex - 1)
}
}

// returns index of first nil object in array, or the end index if the array does not contain any nil values
private func getFirstNilIndex<T>(fromArray array: [T?]) -> Int {
for (index, item) in array.enumerated() {
if item == nil {
return index
}
}
return array.endIndex
}

这是由于一种奇怪的情况,我们有一个双重包装的可选。 Array.last 返回一个可选值,当它返回的非 nil 值本身是一个可选值时,您必须重新包装该值!我认为这行不通,因为我不知道 Swift 是否会区分 .some(.none) 和 .none。

所以我想问你们所有人,你们能找到更好或更“快速”的方法来实现这一目标吗?您如何看待这个解决方案?您能否推荐一种不同的方法,或者您是否对语言的这一方面有任何有益的评论,可以帮助我更清楚地理解这个过程?

最佳答案

  • 现有的 index(where:) 方法可用于查找第一个 nil 条目的索引。
  • 如果找到 nil 元素,则替换条目,否则附加一个条目。

这比总是插入一个新条目然后检查更简单如果最后一个元素应该被删除。

func insertValue<T>(element: T, array: inout [T?]) {

if let idx = array.index(where: { $0 == nil } ) {
array[idx] = element
} else {
array.append(element)
}
}

关于ios - 如何最好地管理 Swift 中的可选数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44579184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com