插入函数作为参数

时间:2016-04-28 20:19:37

标签: swift function unit-testing closures alamofire

我现在正在测试我的Alamofire代码。我试图创建一个可重用的方法,我可以传递一个状态代码和一个需要作为参数调用的方法。我正在考虑使用一个结束块,但语法正在逃避我,并没有帮助我开始使用Swift。这是一个例子:

func parseJsonResponse(response: Response <AnyObject, NSErrror>){
    //parsing
}

func test_networkRequest(withStatusCode statusCode: Int, /* parse function as parameter */) {

      stub(isHost("https://httpbin.org")) { _ in

        return OHHTTPStubsResponse(fileAtPath:OHPathForFile("wsresponse.json", self.dynamicType)!,
            statusCode:statusCode, headers:["Content-Type":"application/json"])
    })

    Alamofire.request(.GET, "https://httpbin.org/get", parameters: ["foo": "bar"])
        .responseJSON { response in
            print(response.request)  // original URL request
            print(response.response) // URL response
            print(response.data)     // server data
            print(response.result)   // result of response serialization
            XCTAsertNotNil(response)


            if let JSON = response.result.value {
                print("JSON: \(JSON)")
            }

            //method should go here
            self.parseJsonResponse(response)


    }
}

我希望能够在我的所有类中重用“test_networkRequest”,并且将以各种方式解析和处理不同类型的json。这就是为什么我希望能够将函数作为参数传递给'test_networkRequest'。

我希望我的最终目标很明确,如果我偏离正轨,我愿意接受建议。 :)

1 个答案:

答案 0 :(得分:1)

要创建一个块,请执行以下操作:

class Foo {
    var block: (statusCode: Int) -> Void
    var optionalBlock: ((argA: Int, argB: String) -> Bool)? // in case you're curious

    init() {
        block = { (statusCode: Int) -> Void in
            // This is the block that can now be passed
        }
    }
}

您可能想要考虑使用块的决定。从句子&#34;我希望能够做出&#39; test_networkRequest&#39;可以在我所有的课程中重复使用......&#34;听起来这可能更适合作为超类中的函数。