首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何传递以参数作为参数的闭包并执行它?

如何传递以参数作为参数的闭包并执行它?
EN

Stack Overflow用户
提问于 2016-07-12 20:58:05
回答 3查看 11K关注 0票数 8

A的初始化器以可选闭包作为参数:

代码语言:javascript
运行
复制
class A {
   var closure: ()?

   init(closure: closure()?) {
      self.closure = closure
      self.closure()
   }
}

我想传递一个带有参数的函数作为闭包:

代码语言:javascript
运行
复制
class B {
    let a = A(closure: action(1)) // This throws the error: Cannot convert value of type '()' to expected argument type '(() -> Void)?'

    func action(_ i: Int) {
       //...
    }
}

A应该使用参数i执行闭包action

我不知道如何正确地写这个,见上面代码注释中的错误。有什么需要改变的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-12 21:35:36

请使您的“什么-你有-现在”代码错误。

假设您的类A如下:

代码语言:javascript
运行
复制
class A {
    typealias ClosureType = ()->Void

    var closure: ClosureType?

    init(closure: ClosureType?) {
        self.closure = closure
        //`closure` would be used later.
    }

    //To use the closure in class A
    func someMethod() {
        //call the closure
        self.closure?()
    }
}

在上面给出了A之后,您需要将类B重写为:

代码语言:javascript
运行
复制
class B {
    private(set) var a: A!
    init() {
        //initialize all instance properties till here
        a = A(closure: {[weak self] in self?.action(1)})
    }

    func action(i: Int) {
        //...
    }
}
票数 7
EN

Stack Overflow用户

发布于 2016-07-12 21:24:19

类型作为参数

在Swift中,每个对象都有一个类型。例如,IntString等可能是您非常熟悉的所有类型。

因此,当您声明一个函数时,应该指定任何参数的显式类型(有时是协议)。

代码语言:javascript
运行
复制
func swallowInt(number: Int) {}

复合类型

Swift也有一个复合类型的概念。这方面的一个例子是元组。元组只是其他类型的集合。

代码语言:javascript
运行
复制
let httpStatusCode: (Int, String) = (404, "Not Found")

函数可以很容易地将元组作为其参数:

代码语言:javascript
运行
复制
func swallowStatusCode(statusCode: (Int, String)) {}

另一种复合类型是函数类型。函数类型由参数元组和返回类型组成。因此,上面的swallowInt函数将具有以下函数类型:(Int) -> Void。类似地,接受IntString并返回Bool的函数将具有以下类型:(Int, String) -> Bool

函数类型作为参数

因此,我们可以使用这些概念重写函数A:

代码语言:javascript
运行
复制
class A {
    var closure: (() -> Void)?

    init(closure: (() -> Void)?) {
        self.closure = closure
        self.closure()
    }
}

然后,传递一个论点就是:

代码语言:javascript
运行
复制
func foo(closure: (Int) -> Void) {
    // Execute the closure
    closure(1)
}
票数 3
EN

Stack Overflow用户

发布于 2016-07-12 21:20:44

我认为您正在尝试的一种方法是使用以下代码:

代码语言:javascript
运行
复制
class ViewController: UIViewController {

    override func viewDidLoad() {
        let _  = A.init(){Void in self.action(2)}
    }

    func action(i: Int) {
        print(i)
    }
}


class A: NSObject {
    var closure : ()?

    init(closure: (()->Void)? = nil) {
        // Notice how this is executed before the  closure
        print("1")
        // Make sure closure isn't nil
        self.closure = closure?()
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38338765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档