gpt4 book ai didi

swift - 如何根据任何项是否为空将可空项数组转换为可为空数组?

转载 作者:行者123 更新时间:2023-11-28 11:18:55 24 4
gpt4 key购买 nike

我有一个可以为 null 的项目数组,其中可能有也可能没有任何 nil:

let source = [1, 2, 3] as [Int?]
// or
let source = [1, 2, nil] as [Int?]

如果没有项目是 nil,我想把它变成一个 [Int]?,值为 Int nil 如果任何项目是 nil

执行此操作的惯用方法是什么?

我尝试过的事情:

// fails with: fatal error: can't unsafeBitCast between types of different sizes 
let result = source as? [Int]

和:

func toNonNullable<T>(array: [T?]) -> [T]? {
if array.filter({$0 == nil}).count != 0 {
return nil;
}

return array.map({$0!})
}

// This works, but seems likey to be non-idiomatic (as well as being ineffecient).
let result = toNonNullable(source)

最佳答案

我会这样写:

let source = [1, 2, nil] as [Int?]
var result : [Int]? = {
for i in source {
if i == nil {
return nil
}
}
return source.map {$0!}
}()

但这并不能真正满足你“低效”的考虑。必须有人查看数组以查看它是否包含 nil,因此循环并执行此操作不会丢失任何内容;但是效率低下的是我们循环了两次,因为map是一个循环。如果你真的讨厌那样,这里有一个出路:

var result : [Int]? = {
var temp = [Int]()
for i in source {
if let i = i {
temp.append(i)
} else {
return nil
}
}
return temp
}()

我认为这些公式中有很多非常地道的 Swifties!

关于swift - 如何根据任何项是否为空将可空项数组转换为可为空数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29908750/

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