iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – Swift Generic Variables致命错误:在展开Optional值时意外发现nil大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试实现一个简单的泛型方法

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])

但每当我运行此代码时,我收到以下错误

我想那是因为我没有为var max_number赋值:T?和var min_number:T?

我不能为它们赋值,因为它们是泛型的,我认为@L_675_5@值正在搞乱这个函数的逻辑……我可能错了,但这是我能够从调试会话中评估的.

在此先感谢,非常感谢任何帮助.

解决方法

@H_944_26@ Swift与其他一些基于C语言的不同之处在于它不允许您使用可能包含@L_675_5@的未初始化变量.如果您声明但不初始化变量,那么在保证初始化之前使用它(基于可能的代码路径),就会出现编译器错误.

但var选项会被隐式初始化为nil.所以这里的问题是你最后被迫解包(例如min_number!).有一些代码路径会导致nils没有被重新赋值给实际值,然后当你打开nil时!你收到一个错误.

原因是这一行:

if(min_number > i)

一个版本的>这需要选项.如果这两个值都是非零值,那么它会比较它们.但如果一个是零,它总是小于非零版本.所以在你的循环中,你从min_number开始为nil,所以你的if语句永远不会评估为true.

这是另一种编写它的方法,它可以解释空数组的可能性:

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中,minelement和maxElement方法从执行前者切换到后者.

大佬总结

以上是大佬教程为你收集整理的ios – Swift Generic Variables致命错误:在展开Optional值时意外发现nil全部内容,希望文章能够帮你解决ios – Swift Generic Variables致命错误:在展开Optional值时意外发现nil所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。