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

Mar*_*uro 1 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
}
Run Code Online (Sandbox Code Playgroud)

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

with BITHockeyManager.sharedHockeyManager() do {
    .configureWithIdentifier(API_KEY)
    .disableCrashManager = true
    .startManager()
    .authenticator.authenticateInstallation()
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在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)
                   }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*n R 6

我不认为那样的东西

with BITHockeyManager.sharedHockeyManager() do {
    .configureWithIdentifier(API_KEY)
    .disableCrashManager = true
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

func with<T>(item : T, closure : T -> Void) {
    closure(item)
}
Run Code Online (Sandbox Code Playgroud)

它只是用给定的项作为参数调用闭包,然后利用"尾随闭包语法"和"简写参数名称" $0:

with( BITHockeyManager.sharedHockeyManager() ) {
    $0.configureWithIdentifier(API_KEY)
    $0.disableCrashManager = true
    // ...
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的解决方案,但我认为这不会使代码更具可读性和可维护性...... :-) (4认同)