gpt4 book ai didi

ios - 如何在 Swift 2.0 中实现 copyWithZone?

转载 作者:行者123 更新时间:2023-11-29 01:28:56 32 4
gpt4 key购买 nike

下面的代码是用Swift 2.0写的,创建一个dispatch_block_t的数组

let a: dispatch_block_t = {
self.pickImages()
}
let b: dispatch_block_t = {
self.takePicture()
}
let c: dispatch_block_t = {
self.pickVideos()
}
let d: dispatch_block_t = {
self.shootVideo()
}
let e: dispatch_block_t = {
self.recordAudio()
}
let f: dispatch_block_t = {
self.closeView()
}

let block1 = Block(block: a)
let block2 = Block(block: b)
let block3 = Block(block: c)
let block4 = Block(block: d)
let block5 = Block(block: e)
let block6 = Block(block: f)

let actionsArray: NSArray = [block1, block2, block3, block4, block5, block6]

Block类定义如下,

class Block: NSObject, NSCopying {
var block: dispatch_block_t

init(block: dispatch_block_t){
self.block = block
}

func copyWithZone(zone: NSZone) -> AnyObject {
return self.block as! AnyObject
}
}

我可以用上面的代码创建一个 dispatch_block_t 数组。但是,我需要将这个数组作为参数传递给另一个函数,而我在传递这个数组时遇到了问题。

我在按钮点击事件上调用这个函数,

menuView = btSimplePopUP(itemImage: imgs as [AnyObject],
andTitles: titles as [AnyObject],
andActionArray: actionsArray as [AnyObject],
addToViewController: self)

执行以下代码片段时出现错误,

- (instancetype)initWithImage:(UIImage *)image title:(NSString *)title action:(dispatch_block_t)action {
if ((self = [super init])) {
_title = [title copy];
_imageView = [[UIImageView alloc]initWithImage:image];
_action = [action copy];
}

return self;
}

错误是,

Could not cast value of type '() -> ()' (0x15164018) to 'Swift.AnyObject' (0x101e500c).

我在 Block 类的 copyWithZone 函数中收到此错误。

btSimplePopUp 的完整源代码可以在这里查看, https://github.com/balram3429/btSimplePopUp/blob/master/btSimplePopUp/btSimplePopUP.m

最佳答案

dispatch_block_t 是一个结构,而不是一个对象。事实上它是一个C结构体。我不明白你为什么需要使用 dispatch_block_t,为什么不直接传递闭包。如果您必须将它传递给 dispatch_ 函数,请将其包装在调用站点的 dispatch_block_t 中。

要简化此操作:

在 Swift 中,dispatch_block_t 只是 () -> () 的别名,即返回 Void 的 void 函数/闭包。所以你可以简单地说

let a = { self.pickImages() }
// etc

let actionArray = [ a, b, c, ...]

然而,pickImages 是一个具有相同类型的函数(从技术上讲,它是在 self 上柯里化(Currying)的,但不用担心这意味着什么)所以你可以忘记a、b、c 位,然后执行此操作

let actionArray = [ self.pickImages, self.takePhoto, ... ]

并且在 Swift 中,只要您有一个采用 dispatch_block_t 的参数,您就可以随时使用该数组中的“对象”之一

dispatch_after(someTime, dispatch_get_main_queue(), actionArray[0])

关于ios - 如何在 Swift 2.0 中实现 copyWithZone?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33687260/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com