Передача замыкания в качестве параметра 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
- Я изменил это, так как это смущало меня и, возможно, вас!