无法将'String.Type'类型的值转换为预期的参数类型'String!'

Vij*_*avi 5 iphone ios swift swift2

我正在使用在目标C中编写的库MDWamp,它具有以下类型的属性

@property (nonatomic, strong) void (^deferredWampCRASigningBlock)( NSString *challange, void(^finishBLock)(NSString *signature) );
Run Code Online (Sandbox Code Playgroud)

这是swift中的签名

public var deferredWampCRASigningBlock: ((String!, ((String!) -> Void)!) -> Void)!
Run Code Online (Sandbox Code Playgroud)

当我尝试以下列方式在swift中实例化它时

self.wamp?.config.deferredWampCRASigningBlock?(str : String , { (str2 : String) -> Void in

        })
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误

无法将'String.Type'类型的值转换为预期的参数类型'String!'

任何建议,将不胜感激.

San*_*tan 14

这意味着您正在传递数据类型.请传递价值.


Rob*_*ier 2

让我们来看看deferredWampCRASigningBlock是什么:

((String!, ((String!) -> Void)!) -> Void)!
Run Code Online (Sandbox Code Playgroud)

这是一个 void 函数,需要做两件事:

  • 一个字符串!
  • 一个带有 String 的 void 函数!

所以当你调用它的时候,你必须把那些东西传递给它。一个字符串和一个函数。

let challenge = "challenge"
let finishBLock: String! -> Void = { signature in }
self.wamp?.config.deferredWampCRASigningBlock?(challenge, finishBlock)
Run Code Online (Sandbox Code Playgroud)

从您的一些评论来看,您似乎不知道challenge此时应该做什么。这表明您不应该调用此函数。该函数旨在由程序中确实知道的部分调用challenge

这种困惑可能与“当我尝试实例化它时”有关。您给出的代码不会实例化任何内容。它正在尝试调用该函数。也许您真正的意思是创建函数并分配它:

self.wamp?.config.deferredWampCRASigningBlock = 
    { (challenge: String!, finishBlock: ((String!) -> Void)!) -> Void in
    // ...
}
Run Code Online (Sandbox Code Playgroud)