如何在Swift中使用较少重复的代码进行连续的方法调用?

时间:2015-01-05 12:30:00

标签: ios swift

以下是来自HockeyApp的示例,它生成以下代码:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    BITHockeyManager.sharedHockeyManager().configureWithIdentifier(API_KEY)
    BITHockeyManager.sharedHockeyManager().disableCrashManager = true
    BITHockeyManager.sharedHockeyManager().startManager()
    BITHockeyManager.sharedHockeyManager().authenticator.authenticateInstallation()

    return true
}

注意每次通话中BITHockeyManager.sharedHockeyManager()的重复。我正在寻找类似(伪代码)的语法:

with BITHockeyManager.sharedHockeyManager() do {
    .configureWithIdentifier(API_KEY)
    .disableCrashManager = true
    .startManager()
    .authenticator.authenticateInstallation()
}

有没有办法在Swift中执行此操作?

编辑:写完这个问题后,我注意到Alamofire正在使用"可链接的方法" ,这实际上是我原本想要的。这允许使用简洁的语法,如下所示(代码来自http://nshipster.com/alamofire/):

Alamofire.request(.GET, "http://httpbin.org/get")
         .response { (request, response, data, error) in
                     println(request)
                     println(response)
                     println(error)
                   }

要在HockeyApp中使用相应的语法,需要修改BITHockeyManager类。

2 个答案:

答案 0 :(得分:6)

我认为不像

with BITHockeyManager.sharedHockeyManager() do {
    .configureWithIdentifier(API_KEY)
    .disableCrashManager = true
    // ...
}

在Swift中是可能的,但可以做的是定义泛型函数

func with<T>(item : T, closure : T -> Void) {
    closure(item)
}

简单地用给定项作为参数调用闭包, 然后利用“尾随闭包语法”和“简写参数名称”$0

with( BITHockeyManager.sharedHockeyManager() ) {
    $0.configureWithIdentifier(API_KEY)
    $0.disableCrashManager = true
    // ...
}

答案 1 :(得分:3)

您始终可以使用以下方法,该方法稍微短一些,但仍需要重复变量manager

let manager = BITHockeyManager.sharedHockeyManager()
manager.configureWithIdentifier(API_KEY)
manager.disableCrashManager = true
manager.startManager()
manager.authenticator.authenticateInstallation()