【问题标题】:How to write blocks (closures) in swift3 right way?如何以正确的方式以 swift3 编写块(闭包)?
【发布时间】:2017-08-15 04:39:21
【问题描述】:

我正在尝试找到如何在 swift3 中编写这些块,任何帮助将不胜感激。

我在 swift3 项目中使用 obj-c PocketSDK。 https://github.com/Pocket/Pocket-ObjC-SDK

我可以通过适当的 Bridge-Header 设置很好地使用此 SDK,但仍然不确定如何编写块部分。

obj-c

[[PocketAPI sharedAPI] callAPIMethod:@"get"
                       withHTTPMethod:PocketAPIHTTPMethodGET
                            arguments:arguments
                              handler:^(PocketAPI *api, NSString *apiMethod, NSDictionary *response, NSError *error) {
                              }];

这是 PocketSDK 中的类型 def。

-(void)callAPIMethod:(NSString *)apiMethod withHTTPMethod:(PocketAPIHTTPMethod)HTTPMethod arguments:(NSDictionary *)arguments delegate:(id<PocketAPIDelegate>)delegate;

     typedef void(^PocketAPIResponseHandler)(PocketAPI *api, NSString*apiMethod, NSDictionary *response, NSError *error);

迅速? (这显示错误。)

    let arguments: [String: Any] = [
        "state": "unread",
        "count": 20
    ]

    PocketAPI.shared().callMethod("get", with: PocketAPIHTTPMethodGET, arguments: arguments) {
        (api: PocketAPI,
        apiMethod: String,
        esponse: [AnyHashable:Any],
        error: Error) in
    }

@更新

我可以避免没有类型 def 的编译错误,但如果我输入参数,仍然会得到无法识别的选择器。如果我在参数中设置 nil,但我不明白。字典有什么问题吗?

    var arguments = [String : Any]()
    arguments["count"] = 20
    arguments["state"] = "unread"

    PocketAPI.shared().callMethod("get", with: PocketAPIHTTPMethodGET, arguments: arguments) {
        (api,
        apiMethod,
        response,
        error) in
    }

错误。

-[_SwiftTypePreservingNSNumber 长度]:无法识别的选择器发送到实例 0x174624540 2017-08-15 14:05:51.345611+0900 Voicepaper2[1062:286998] * 由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[_SwiftTypePreservingNSNumber 长度]:无法识别的选择器发送到实例 0x174624540' * 首先抛出调用栈:

【问题讨论】:

  • 我认为在swift中你不必在调用时声明类型,只需要变量名
  • 谢谢,看来参数部分(如何快速制作字典)可能是错误的。
  • 我更新了问题,如果你有时间可以看看。
  • 您是否尝试过使用 NSDictionary 而不是 [String: Any]?它们不是一回事。
  • 问题是“count”:20,但应该是“20”。感谢您的帮助!

标签: ios swift3 pocket


【解决方案1】:

解决了!这是最终答案,谢谢!

    let arguments: [String: Any] = [
        "state": "unread",
        "count": "20"
    ]

    PocketAPI.shared().callMethod("get", with: PocketAPIHTTPMethodGET, arguments: arguments) {
        (api,
        apiMethod,
        response,
        error) in
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2014-10-20
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多