当前位置: 首页 > 面试题库 >

Swift可选的inout参数和nil

麹浩瀚
2023-03-14
问题内容

Optional inoutSwift中的函数是否可以具有参数?我正在尝试这样做:

func testFunc( inout optionalParam: MyClass? ) {
    if optionalParam {
        ...
    }
}

…但是当我尝试调用它并通过时nil,它给了我一个奇怪的编译错误:

Type 'inout MyClass?' does not conform to protocol 'NilLiteralConvertible'

我不明白为什么我的类已经被声明为可选的,所以必须遵循某些特殊的协议。


问题答案:

它不会编译,因为该函数需要引用,但是您通过了nil。这个问题与可选无关。

通过用声明参数inout意味着您将在函数体内为其分配一些值。如何分配价值nil

你需要这样称呼它

var a : MyClass? = nil
testFunc(&a) // value of a can be changed inside the function

如果您了解C ,则这是代码的C 版本,没有可选的

struct MyClass {};    
void testFunc(MyClass &p) {}
int main () { testFunc(nullptr); }

而您有此错误信息

main.cpp:6:6: note: candidate function not viable: no known conversion from 'nullptr_t' to 'MyClass &' for 1st argument

这相当于您所获得的(但更容易理解)



 类似资料:
  • 当我将firstThing(第一件事)设置为default(默认值)时,如果没有默认值nil(默认值),这将起作用,我会得到一个错误,即调用函数时缺少参数。 通过键入Int 我认为它使它成为可选的,默认值为零,对吗?如果是这样,为什么没有=nil它就不能工作?

  • 问题内容: 鉴于: 有什么方法可以使参数(和)的类型也保持不变? 更改类型会出现以下错误: @escaping属性仅适用于函数类型 删除该属性后,代码将编译并运行,但由于闭包使函数的作用范围变大,因此似乎并不正确。 问题答案: 有一个SR-2552报告无法识别功能类型别名。这就是错误的原因。您可以通过扩展函数签名中的函数类型来解决: 编辑1 : 我实际上是在xcode 8 beta版本下,但尚未解

  • 问题内容: 我正在尝试创建一个字符串扩展来做类似的事情 看起来像这样 它给我以下编译错误 类型CVaListPointer不符合协议CVargType 有人知道如何解决此编译错误吗? 问题答案: 这应该非常简单,只需更改您的参数,如下所示: 初始化(格式:语言环境:参数:)

  • 阅读使用的所有优点,但是,如果我们想在查询参数使用此属性时拥有可选参数,它不起作用。它仍然将所有参数验证为强制性的。知道如何使其可选吗? 执行此代码时,它始终需要 。没有此参数,它不会运行。 编辑:即使传递了id的默认值,它也不起作用。

  • 问题内容: 是否可以为可选的通用参数提供默认值? 我正在尝试做这样的事情: 但我说错了 这只是我试图做的不可能的事吗? 问题答案: 用您完成的方式是不可能的。仅考虑上述代码,什么是类型?就像它说的那样,编译器无法弄清楚(我也不能,因为数据不存在,我也不能。) 特定问题的解决方案是重载而不是使用默认值: 但这引发了您在这里做什么的问题。您会认为应该如此。否则,您在做什么?如果不诉诸(您应该强烈避免)

  • 用户在这个插件的很多方面都可以进行定制,用户通过插件选项来达到这个目的(这些选项会在插件初始化的时候起效)。这些选项包括: 选项 描述 aspectRatio 长宽比,以后在选择时候就会维持不变。例如:"4:3" autoHide 如果设为true,那么在选择完后区域会消失。Default:false classPrefix 预先给插件元素的前缀 Default:imgareaselect dis