Передача замыкания в качестве параметра init в Swift

Я пытаюсь преобразовать фрагмент кода Objective-C, который я нашел в этой статье. Вот оригинальный код.

.h файл

#import <Foundation/Foundation.h>

typedef void (^TableViewCellConfigureBlock)(id cell, id item);

@interface ArrayDataSource : NSObject <UITableViewDataSource>

- (id)initWithItems:(NSArray *)anItems
     cellIdentifier:(NSString *)aCellIdentifier
 configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock;

@end

.m файл

@interface ArrayDataSource ()

@property (nonatomic, strong) NSArray *items;
@property (nonatomic, copy) NSString *cellIdentifier;
@property (nonatomic, copy) TableViewCellConfigureBlock configureCellBlock;

@end


@implementation ArrayDataSource

- (id)initWithItems:(NSArray *)anItems
     cellIdentifier:(NSString *)aCellIdentifier
 configureCellBlock:(TableViewCellConfigureBlock)aConfigureCellBlock
{
    self = [super init];
    if (self) {
        self.items = anItems;
        self.cellIdentifier = aCellIdentifier;
        self.configureCellBlock = [aConfigureCellBlock copy];
    }
    return self;
}

@end

Вот моя попытка.

import Foundation
import UIKit

public class TableViewDataSource: NSObject, UITableViewDataSource {

    var items: [AnyObject]
    var cellIdentifier: String
    var TableViewCellConfigure: (cell: AnyObject, item: AnyObject) -> Void

    init(items: [AnyObject]!, cellIdentifier: String!, configureCell: TableViewCellConfigure) {
        self.items = items
        self.cellIdentifier = cellIdentifier
        self.TableViewCellConfigure = configureCell

        super.init()
    }

}

Но я получаю ошибку в этой строке self.TableViewCellConfigure = configureCell говоря использование необъявленного типа 'TableViewCellConfigure'.

Я попробовал другой способ. Вместо того, чтобы объявлять переменную для замыкания, я объявил ее как typealias.

typealias TableViewCellConfigure = (cell: AnyObject, item: AnyObject) -> Void

Но тогда я получаю новую ошибку в той же строке, что "TableViewDataSource" не имеет члена с именем "TableViewCellConfigure".

Может кто-нибудь помочь мне решить эту проблему?

Спасибо.

1 ответ

Решение

Проблема в том, что вы спутали TableViewDataSource с TableViewCellConfigure в вашем init, Это хорошо для меня:

typealias TableViewCellConfigure = (cell: AnyObject, item: AnyObject) -> Void // At outer level

class TableViewDataSource: NSObject/*, UITableViewDataSource */ { // Protocol commented out, as irrelevant to question

    var items: [AnyObject]
    var cellIdentifier: String
    var tableViewCellConfigure: TableViewCellConfigure // NB case

    init(items: [AnyObject], cellIdentifier: String!, configureCell: TableViewCellConfigure) {
        self.items = items
        self.cellIdentifier = cellIdentifier
        self.tableViewCellConfigure = configureCell

        super.init()
    }

}

Обратите внимание, что вы использовали заглавные буквы для имени свойства tableViewCellConfigure - Я изменил это, так как это смущало меня и, возможно, вас!

Другие вопросы по тегам