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

参数传递时Swift 4中的编译错误

松昱
2023-03-14
问题内容

我在Xcode 9 Beta 3中使用了3rd party库。在完成调用中出现以下错误,我无法解决此错误:

DispatchQueue.main.asyncAfter(deadline: .now() + delay) { 
    self.animationView?.alpha = 0
    self.containerView.alpha  = 1
    completion?()    // -> Error: Missing argument parameter #1 in call.   
}

并在完成功能中得到以下警告:

func openAnimation(_ completion: ((Void) -> Void)?) {    
    // -> Warning: When calling this function in Swift 4 or later, you must pass a '()' tuple; did you mean for the input type to be '()'?
}

问题答案:

在Swift 4中,对元组的处理比以往更加严格。

这种关闭类型:(Void)->Void表示一个关闭

  • 接受一个参数,其类型为 Void
  • 返回Void,表示不返回任何值

因此,请尝试以下任一方法:

将类型的值传递Void给闭包。(一个空元组()是的唯一实例Void。)

completion?(())

要不然:

更改参数的类型completion

func openAnimation(_ completion: (() -> Void)?) {
    //...
}

请记住,两种类型的(Void)->Void()->Void甚至在斯威夫特3.不同的,所以后者将是适当的,如果你打算代表 不带参数的闭合型

这项更改是SE-0029从功能应用程序中删除隐式元组splat行为的一部分,该行为据说已在Swift
3中实现,但看来Swift 3尚未完全实现。

在这里,我向您展示了一个简化的检查代码,您可以在操场上检查差异。

import Foundation

//### Compiles in Swift 3, error and warning in Swift 4
class MyClass3 {

    func openAnimation(_ completion: ((Void) -> Void)?) {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {

            completion?()
        }
    }

}

//### Compiles both in Swift 3 & 4
class MyClass4 {

    func openAnimation(_ completion: (() -> Void)?) {
        DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {

            completion?()
        }
    }

}


 类似资料:
  • 我在Snowflake中创建了一个函数,其中包含两个“日期”参数: 我假设我错过了一些简单的东西。是否因为I已将参数声明为“日期”数据类型,而select语句将我的日期值归类为字符串? 提前致谢

  • 此模式抛出TypeScript错误: 类型为“(string | number)[]”的参数不能分配给类型为“string[]| number[]”的参数 我理解这是因为TypeScript编译器会将其视为字符串和数字混合的数组。 是否有一种类型安全的方法来实现这一点?我只能想投给任何感觉不好的[]:

  • 这里变量x(在主)的值是6,这是正确的,但当我写同样的事情在system.out.println== 当我尝试在print语句中放入x时,它工作得很好。但我想知道它给出错误的原因。 错误:

  • 问题内容: 我有一个看起来像这样的方法: 因此,我期望传递的集合是实现Marshallable接口的Enum。如果我在运行时具有具体的Enum类型,则可以正常工作,但是我编写了一个测试方法,该方法从类对象动态创建一个Enum列表(实现Marshallable),并且无法将此列表传递给上面的方法。 标记的行将给出编译错误。我不知道如何在不更改方法签名的情况下传递列表。 问题答案: 您需要对泛型辅助方

  • 您可以将其他数据作为常规方法参数传递到后台任务。我再次使用下面的例子(希望没有让你厌恶): BackgroundJob.Enqueue(() => Console.WriteLine("Hello, {0}!", "world")); 在常规方法调用中,在执行后台作业期间, Console.WriteLine 方法将使用这些参数。为了参数传递进去,需要先序列化。 使用 了不起的 Newtonsof

  • 我正在尝试为我的react-native项目生成一个签名的APK。我收到错误消息错误:“未编译的PNG文件作为参数传递。必须先编译成.flat文件..” 如何解决此问题?我已经研究了这个问题,并尝试将添加到gradle-wrapper.properties文件中。 第一步是 但是,我没有看到任何关于为my-release-key.keystore文件指定位置的内容。直到我用了