2014-10-29 60 views
5

我有一个单身APIService像下面斯威夫特功能参数

import Foundation 
import Alamofire 
import SwiftyJSON 

typealias Success = JSON -> Void 
typealias Failure = NSError? -> Void 

class APIService { 

    private let BaseURL = "http://api.openweathermap.org/data/2.5" 

    class var instance: APIService { 
     struct Singleton { 
      static let instance: APIService = APIService() 
     } 
     return Singleton.instance 
    } 

    func currentWeather(cityName: String, success:Success?, failure:Failure?) { 
     let url = BaseURL + "/weather" 
     Alamofire.request(.GET, url, parameters:["q" : cityName]) 
      .responseJSON { (_, _, jsonObject, error) in 
       if error != nil && failure != nil { 
        failure!(error) 
       } else { 
        let json = JSON(jsonObject!) 
        if success != nil { 
         success!(json) 
        } else { 
         println(json) 
        } 
       }         
     } 
    } 
} 

当我打电话给在其他地方,比如这个的UIViewController功能,这样,它的确定

import UIKit 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     APIService.instance.currentWeather("San Gabriel", success: nil, failure: {error in println(error)}) 


    } 

} 

然而它是编译错误,当我打电话这样的功能

APIService.instance.currentWeather("San Gabriel", success: {json in println(json)}, failure: {error in println(error)}) 

0 swift     0x0000000101f2da68 llvm::sys::PrintStackTrace(__sFILE*) + 40 
1 swift     0x0000000101f2df54 SignalHandler(int) + 452 
2 libsystem_platform.dylib 0x00007fff95838f1a _sigtramp + 26 
3 libsystem_platform.dylib 0x00007fff5e9903d8 _sigtramp + 3373626584 
4 swift     0x00000001013d1f8c swift::Lowering::SILGenFunction::emitIgnoredExpr(swift::Expr*) + 108 
5 swift     0x00000001013f1829 swift::Lowering::SILGenFunction::visitBraceStmt(swift::BraceStmt*) + 297 
6 swift     0x00000001013f48e8 swift::ASTVisitor<swift::Lowering::SILGenFunction, void, void, void, void, void, void>::visit(swift::Stmt*) + 152 
7 swift     0x00000001013c0da1 swift::Lowering::SILGenFunction::emitValueConstructor(swift::ConstructorDecl*) + 5617 
8 swift     0x000000010139c04a swift::Lowering::SILGenModule::emitConstructor(swift::ConstructorDecl*) + 666 
9 swift     0x000000010139d8bb swift::SILModule::constructSIL(swift::Module*, swift::SourceFile*, swift::Optional<unsigned int>) + 475 
10 swift     0x000000010139d968 swift::performSILGeneration(swift::SourceFile&, swift::Optional<unsigned int>) + 72 
11 swift     0x0000000101273e18 frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 3432 
12 swift     0x000000010127196d main + 1677 
13 libdyld.dylib   0x00007fff93e515c9 start + 1 
Stack dump: 
0. Program arguments: 
1. While silgen emitConstructor SIL function @_TFVSC20NSJSONReadingOptionsCfMS_FT_S_ for 'init' at <invalid loc> 

如果我把函数只是在UIViewController ,一切都很好,太有线了,需要帮助

+0

好像相对于SwiftyJSON的JSON结构的东西,但我还是搞不清为什么? – xmkevinchen 2014-10-29 23:48:10

+0

编译器崩溃。提交bug报告的时间 – 2014-10-30 02:34:42

+1

我遇到了与SwiftJSON的JSON结构相同的编译器错误。我做了一个像你一样的API单例,它只能在测试用例上工作,并在任何控制器上失败。 – yuhua 2014-11-27 08:30:50

回答

0

我不认为这是答案。

if error != nil && failure != nil { 
    failure!(error) 
} else { 
... 

应该

if error != nil { 
    failure ?? failure(error) // or: failure?(error) 
} else { 
... 
+1

'失败?(错误)'很好,'失败?失败(错误)'不是 – 2014-10-30 02:35:43