gpt4 book ai didi

ios - Swift 通用变量 fatal error : unexpectedly found nil while unwrapping an Optional value

转载 作者:搜寻专家 更新时间:2023-10-31 22:03:08 25 4
gpt4 key购买 nike

我正在尝试实现一个简单的通用方法:

func findMax<T: Comparable>(numbers_array : [T]) -> ( min_tuple : T , max_tuple : T )
{
var max_number : T?
var min_number : T?

for i in numbers_array
{
if(max_number < i)
{
max_number = i
}
if(min_number > i)
{
min_number = i
}
}
return (min_number! , max_number!)
}

我正在尝试访问这样的方法:

let result = findMax([3.4, 5, -7, -7.8])

但是每当我运行这段代码时,我都会收到以下错误:

fatal error: unexpectedly found nil while unwrapping an Optional value

我想那是因为我还没有为 var max_number : T?var min_number : T?

赋值

我不能给它们赋值,因为它们是通用类型,我认为垃圾值扰乱了这个函数的逻辑......我可能是错的,但这是我能够评估的我的调试 session 。

提前致谢,非常感谢任何帮助。

最佳答案

Swift 不同于其他一些基于 C 的语言,因为它不允许您使用可能包含垃圾的未初始化变量。如果声明但不初始化变量,然后在保证初始化之前使用它(基于可能的代码路径),则会出现编译器错误。

但是 var 选项被隐式初始化为 nil。所以这里的问题是你在最后强制解包(例如 min_number!)。有一些代码路径导致 nil 没有被重新分配给一个真实的值,然后当你用 ! 解开 nil 时,你会得到一个错误。

原因是这里的这一行:

if(min_number > i)

有一个 > 版本 接受可选值。如果这两个值都是非 nil,则比较它们。但如果一个是 nil,它总是小于非 nil 版本。所以在你的循环中,你以 min_number 作为 nil 开始,所以你的 if 语句永远不会计算为真。

这是考虑到空数组可能性的另一种写法:

func findMax<T: Comparable>(numbers_array : [T]) -> ( min_tuple : T , max_tuple : T )
{
if let first_number = numbers_array.first {
var min_number = first_number, max_number = first_number
for i in dropFirst(numbers_array) {
max_number = max(max_number, i)
min_number = min(min_number, i)
}
return (min_number,max_number)
}
else {
// the user has passed in an empty array...
// so there is no minimum, you must take some
// action like:
fatalError("empty array passed")
}
}

或者,您可以让您的函数返回一个可选值,而不是 fatalError,如果序列为空,则返回一个 nil。在 Swift 2.0 中,minElementmaxElement 方法从执行前者切换到执行后者。

关于ios - Swift 通用变量 fatal error : unexpectedly found nil while unwrapping an Optional value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31080641/

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