Ios 将swift闭包作为属性存储在objective-c类中,其中块是使用typedef声明的

Ios 将swift闭包作为属性存储在objective-c类中,其中块是使用typedef声明的,ios,objective-c,iphone,swift,ios8.1,Ios,Objective C,Iphone,Swift,Ios8.1,天哪,我这辈子都没法让它工作 我在objective-c中有一个typdef,看起来像这样: typedef void(^StringBlock)(NSString*string); 我有一个objective-c类,它有一个属性,允许您存储自己的StringBlock类型块。该属性在objective-c中声明如下: @property(非原子,复制)StringBlock onTextSubmitBlock; 在objective-c中为其指定块如下所示: input.onT

天哪,我这辈子都没法让它工作

  • 我在objective-c中有一个
    typdef
    ,看起来像这样:
typedef void(^StringBlock)(NSString*string);
  • 我有一个objective-c类,它有一个属性,允许您存储自己的
    StringBlock
    类型块。该属性在objective-c中声明如下:
@property(非原子,复制)StringBlock onTextSubmitBlock;
  • 在objective-c中为其指定块如下所示:
input.onTextSubmitBlock=^(NSString*text){
};
  • 我想在Swift课堂上做同样的事情!我最接近于找到一种有效的方法是:
input!。onTextSubmitBlock={(StringBlock)在
}
编译,但我无法访问所需的参数(
(NSString*text)
,在objective-c中…)


我相信,一旦我习惯了Swift,这一点就显而易见了,但我还缺少什么呢?

你已经很接近了。您应该能够这样使用它:

input!.onTextSubmitBlock = { text in
    println(text)
}
Swift将根据声明推断
text
NSString
。Thera有两种替代方法,你也可以声明这一点。像这样:

input!.onTextSubmitBlock = {
    println($0) // $0 is text
}
这是:

input!.onTextSubmitBlock = { (text: NSString) -> () in
    println(text)
}

您是否尝试了
input!。onTextSubmitBlock={println中的文本(文本)}
?它对我有用。是的!这太简单了。但为什么:
input!。onTextSubmitBlock={(text:NSString)in
fail?您可以这样做,但是您还必须包括返回类型,如:
input!。onTextSubmitBlock={(text:NSString)->()in
做得很好。谢谢!但是编译器仍然抱怨
input!。onTextSubmitBlock={(text:NSString)->()在
中,说
无法将类型为“(NSString)->()”的值分配给类型为“StringBlock!”的值
很抱歉继续使用noobishness…Swift很奇怪。我使用的是:
input!。onTextSubmitBlock={text in
但如果text为nil,程序崩溃时在打开可选值时意外发现nil。似乎我无法使用
let
,这是我能想到的唯一选项…因为您在Objective-C中声明了块,它正在作为I导入swift不完全展开可选(自动完成将显示为
NSString!
)。如果您运行的是Xcode 6.3 Beta版,则可以向Objective-C块添加可为空或不为空(请参阅以获取解释。例如,您可以在Objective-C中将其声明为可为空,然后在Swift中将其变为
NSString?
。\uu nonnull将变为
NSString
。如果您不在betas上,您只需等待该功能。