1

次のコードは、配列を作成するために 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;
}

エラーは、

タイプ '() -> ()' (0x15164018) の値を 'Swift.AnyObject' (0x101e500c) にキャストできませんでした。

クラスcopyWithZoneの関数でこのエラーが発生しています。Block

btSimplePopUp の完全なソース コードは、 https: //github.com/balram3429/btSimplePopUp/blob/master/btSimplePopUp/btSimplePopUP.m で確認できます 。

4

2 に答える 2

1

dispatch_block_tオブジェクトではなく構造体です。実際、これは C 構造体です。なぜdispatch_block_tを使用する必要があるのか​​\u200b\u200bわかりません。クロージャを渡すだけではどうですか。関数に渡す必要がある場合はdispatch_、呼び出しサイトで dispatch_block_t にラップします。

これを迅速化するには:

Swift では、dispatch_block_t単に() -> ()void 関数/クロージャを返すためのエイリアスですVoid。だからあなたは簡単に言うことができます

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

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

ただし、pickImages同じタイプの関数です(技術的にはカリー化されてselfいますが、それが何を意味するかは気にしないでください)ので、a、b、cビットを忘れてこれを行うことができます

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

また、Swift では、dispatch_block_tたとえば、

dispatch_after(someTime, dispatch_get_main_queue(), actionArray[0])
于 2015-11-13T08:50:41.390 に答える