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

闭包中的隐式返回导致错误

陈高寒
2023-03-14
问题内容
Error: Cannot convert the expression type (String, MyType) to ()

从以下代码

Test(method: {[weak self] (message: String) in self?.callback(message)}, instance: self)

如果我添加一个return语句,它将起作用,并且错误消失了

Test(method: {[weak self] (message: String) in self?.callback(message); return}, instance: self)

任何建议都不确定如何在没有虚拟return语句的情况下处理上述问题。

这是我的课程测试

public class Test { 
    private var instance: AnyObject?
    private var method: ((message: String) -> ())?

    public init(method: (String -> ())?, instance: AnyObject) {

    }
 }

编辑

我已经完成了一个基于操场的简约示例(请复制粘贴以进行测试)

class Test {

    private var _method: ((String) -> ())?

    weak private var _instance: AnyObject?

    init(method: (String -> ())?, instance: AnyObject?) {
        _method = method
        _instance = instance
    }
}

class Another {

    func register() {
        //this doesn't need a return
        Test(method: {(message: String) in self.callback(message)}, instance: self)

        //this needs a return once I add [weak self]
        Test(method: { [weak self] (message: String) in self?.callback(message); return}, instance: self)
    }

    func callback(message: String) {
        println(message)
    }
}

问题答案:

任何建议都不确定如何在没有虚拟return语句的情况下处理上述问题。

您已经很好地解决了问题。匿名函数自动使用单行函数主体作为返回值,因此,要防止这种情况导致类型与预期返回类型(Void)不匹配,您必须添加另一行代码,以使其
不是 单行函数身体。伪返回语句本身返回Void,是处理它的 方法。我会用它继续前进。有一些时髦的解决方法,但是您所拥有的正是我会做的。

编辑:要了解类型不匹配的来源,请尝试以下操作:

struct Test {
    func voider() -> Void {}
}

let testMaybe = Optional(Test())
let result = testMaybe?.voider()

现在result不是虚空了;这是包装空心的可选。那就是你正在发生的事。一个空值是预期的,但您的单行匿名函数返回一个包装空值的Optional。通过添加另一条显式返回Void的行,您解决了该问题。



 类似资料:
  • 我有一个RecyclerView适配器,它可以处理我已经使用多年的几种视图类型。最近,我发现了关于,但我似乎遇到了一个问题,它似乎为返回了错误的值。 我有一个用例,我想显示一个标题,下面是一个项目列表。我已经为标题创建了一个新的适配器类,但是列表项将继续使用我的旧适配器(它还处理其他几种视图类型)。 因此,我连接了两个适配器: 这工作正常,但是当我打开活动时,它立即崩溃并给出错误: JAVAlan

  • 闭包作为参数(Taking closures as arguments) 现在我们知道了闭包是 trait,我们已经知道了如何接受和返回闭包;就像任何其它的 trait! 这也意味着我们也可以选择静态或动态分发。首先,让我们写一个获取可调用结构的函数,调用它,然后返回结果: fn call_with_one<F>(some_closure: F) -> i32 where F : Fn(i

  • 我试图测试一个服务方法,但为了做到这一点,我必须模拟我的ReportRepository。除了对Include方法的调用使模拟返回为NULL外,其他操作都很好。 下面返回预期的报告: 但该服务实际上执行以下操作: 问题是,当我在模拟中包含'include'方法时,返回的是null而不是预期的报告,因此我的测试以:

  • 问题内容: 我从通话中返回了大量HTML 。来自PHP的字符串开头有两个换行符,例如 这里是电话: 一切正常,直到我添加抛出该点为止。如果我删除换行符,它将起作用。我正在使用因为jQuery说: 如果已知字符串是HTML,但可以以不是HTML标签的任意文本开头,则将其传递给jQuery.parseHTML(),它将返回表示标记的DOM节点数组。可以从中创建一个jQuery集合,例如:$($。par

  • 问题内容: 我不了解这种情况下的行为。据我了解,带有无效子查询的查询应导致错误。但在此示例中,它返回一些行。 测试数据: 可以正常工作: 但是下面的查询也是在检索行,显然是通过从“ test_values”表中获取“ test_id2”列,而不是从子查询中所述的“ test_lookup”表中获取,尽管未在内部和外部使用别名部分。 问题答案: 原因是因为当子查询中不存在非别名列,但外部查询中确实存

  • 问题内容: 在Swift中,如果闭包仅包含单个语句,它将自动返回从该单个语句返回的值。 并非在所有情况下都感觉很自然。让我们看一个例子: 如您所见,即使闭包只应调用一个简单函数,它也会尝试自动返回其返回值,该返回值的类型为,与返回类型不匹配。 我可以通过实现闭包主体来避免这种情况: 感觉非常奇怪。 有没有更好的方法可以做到这一点,或者这仅仅是我必须忍受的东西? 问题答案: 发生这种情况的原因是单行