Ios 如何在Swift 2.0中创建调度块数组?
我在Swift 1.2中有一个代码来创建一个调度块数组,它运行良好。但同样的代码在Swift 2.0中抛出错误Ios 如何在Swift 2.0中创建调度块数组?,ios,swift,swift2,grand-central-dispatch,Ios,Swift,Swift2,Grand Central Dispatch,我在Swift 1.2中有一个代码来创建一个调度块数组,它运行良好。但同样的代码在Swift 2.0中抛出错误 var menuView: btSimplePopUP! let actions: [dispatch_block_t] = [{self.pickImages()}, {self.takePicture()}, {self.pickVideos()}, {self.shootVideo()}, {self.recordAudio()}, {s
var menuView: btSimplePopUP!
let actions: [dispatch_block_t] = [{self.pickImages()},
{self.takePicture()},
{self.pickVideos()},
{self.shootVideo()},
{self.recordAudio()},
{self.closeView()}]
menuView = btSimplePopUP(itemImage: imgs as [AnyObject],
andTitles: titles as [AnyObject],
andActionArray: actions as NSArray as [AnyObject],
addToViewController: self)
上述代码在Swift 1.2中运行良好。但在Swift 2.0中,它抛出以下错误
[dispatch_block_t]不能转换为NSArray
如何使用dispatch\u block\t创建NSArray
更新:
我已将上述代码替换为以下代码
let actions: [Any] = [{self.pickImages()},
{self.takePicture()},
{self.pickVideos()},
{self.shootVideo()},
{self.recordAudio()},
{self.closeView()}]
menuView = btSimplePopUP(itemImage: imgs as [AnyObject],
andTitles: titles as [AnyObject],
andActionArray: actions as! [AnyObject],
addToViewController: self)
现在,前面的错误消失了。但我在运行时遇到以下错误
致命错误:数组元素无法桥接到Objective-C
任何帮助都将不胜感激。
dispatch\u block\t
不是从任何对象继承的,它不是对象。
但您可以修改代码并将AnyObject
更改为Any
,如下所示:
andActionArray : actions as [Any]
它应该对你有用
UPD:
您的函数将param作为NSArray
,您只需将数组强制转换为此类型,此代码在我的swift游乐场中工作:
func pickImages() {}
func takePicture() {}
func shootVideo() {}
let actions: [dispatch_block_t] = [{pickImages()},
{takePicture()},
{shootVideo()}]
var actionArray: NSArray = actions as NSArray // pass it to the btSimplePopUP init
导入
XCPlaygroundPage.currentPage.needsIndefiniteExecution=false
进口基金会
设a:dispatch_block_t={
打印(“a”)
}
设b:dispatch_block_t={
打印(“b”)
}
设arr=[a,b]
打印(arr.dynamicType)
arr.forEach{(b)->()在
b()
}
/*印刷品
数组()>
A.
B
*/
类块{
var块:调度块
初始化(块:调度块){
self.block=块
}
}
设block1=Block(Block:a)
设block2=Block(Block:b)
设arr2:NSArray=[block1,block2]
打印(arr2)
arr2.forEach{(p)->()在
(p作为?块)?.Block()
}
/*印刷品
(
块
块
)
A.
B
*/
感谢您的回复。。但是现在我得到以下错误“[dispatch\u block\t]不能转换为[Any]”显示您的btSimplePopUP
init函数?那里的andActionArray
是什么类型?没有你的代码,我帮不了你更多的忙。SimplePopup是一个开源软件,我用它来显示菜单。init函数的链接为,init函数从第284I行开始:我无法将其强制转换为NSArray。我收到这个错误,“[dispatch\u block\t]无法转换为NSarray”请查看我的更新问题。我已将操作类型更改为[Any],并且我无法得到任何编译时错误。但在运行时,我得到了“致命错误:数组元素无法桥接到Objective-C”,感谢您的回复。我需要将此数组作为NSArray传递给函数。通过时,我遇到了一个错误,“[dispatch_block_t]无法转换为NSarray”。是否将其作为NSArray传递?NSArray无法保存值类型。为此,您需要将调度块装箱。看看我的最新答案谢谢@user3441734现在,我可以把它转换成NSArray。但是我在函数定义中遇到了以下错误,***NSForwarding:警告:类'ProjName.Block'的对象0x7a5841b0未实现methodSignatureForSelector:--无法识别的选择器-[ProjName.Block copy]
函数定义是,-(instancetype)initWithImage:(UIImage*)图像标题:(NSString*)title action:(dispatch_block_t)action{if((self=[super init]){{title=[title copy];_imageView=[UIImageView alloc]initWithImage:image];_action=[action copy];}return self;}
aha…所以现在这是一个全新的问题:-)。我将检查您的objc代码的源代码。。。
import XCPlayground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = false
import Foundation
let a: dispatch_block_t = {
print("a")
}
let b: dispatch_block_t = {
print("b")
}
let arr = [a,b]
print(arr.dynamicType)
arr.forEach { (b) -> () in
b()
}
/* prints
Array<@convention(block) () -> ()>
a
b
*/
class Block {
var block: dispatch_block_t
init(block: dispatch_block_t){
self.block = block
}
}
let block1 = Block(block: a)
let block2 = Block(block: b)
let arr2: NSArray = [block1,block2]
print(arr2)
arr2.forEach { (p) -> () in
(p as? Block)?.block()
}
/* prints
(
Block,
Block
)
a
b
*/