我有一个Swift iOS项目,它使用用Objective-C编写的MLPAutoCompleteTextField库。这是我的Swift类试图实现的 MLPAutoCompleteTextFieldDataSource 协议:
@protocol MLPAutoCompleteTextFieldDataSource <NSObject>
@optional
- (void)autoCompleteTextField:(MLPAutoCompleteTextField *)textField
possibleCompletionsForString:(NSString *)string
completionHandler:(void(^)(NSArray *suggestions))handler;
- (NSArray *)autoCompleteTextField:(MLPAutoCompleteTextField *)textField
possibleCompletionsForString:(NSString *)string;
@end
这是我的Swift课程:
class MyAutocompleteDataSource : NSObject, MLPAutoCompleteTextFieldDataSource {
override func autoCompleteTextField(textField : MLPAutoCompleteTextField,
possibleCompletionsForString : String)
-> Array<String> {
return nil
}
}
编译后,会报告这两个错误:
错误:(17,23)方法不会覆盖其超类中的任何方法
错误:(17,23)Objective-C方法'autoCompleteTextField:possibleCompletionsForString:'由方法'autoCompleteTextField(:possibleCompletionsForString :)'提供,与可选的需求方法'autoCompleteTextField(:协议'MLPAutoCompleteTextFieldDataSource'中的possibleCompletionsForString :)'
真的很感激,如果你不仅可以解释如何解决这个问题,还可以在Swift中实现Obj-C协议时指出一些关于如何映射各种类型(数组,回调等)的一般规则或参考。
答案 0 :(得分:3)
对于第一个错误,在实现协议方法时不需要覆盖,仅在从超类重新实现方法时
对于第二个错误,在协议中,该方法返回一个NSArray,它被桥接为[AnyObject],而不是[String]
那会给出
@objc func autoCompleteTextField(textField: MLPAutoCompleteTextField, possibleCompletionsForString string: String) -> Array<AnyObject> {
return []
}
如果您确实是数组,那么数组只会包含字符串,您可以将协议更改为以下内容,您只需要删除覆盖关键字
- (NSArray <NSString *> *)autoCompleteTextField:(MLPAutoCompleteTextField *)textField
possibleCompletionsForString:(NSString *)string;
请注意,返回nil将不起作用,因为您返回Array而不是Array?。如果你真的希望返回nil,你需要为返回类型数组添加可空性吗?
如果您喜欢较短的行
,可以用[String]替换Array答案 1 :(得分:0)
试试这个
override func autoCompleteTextField(textField : MLPAutoCompleteTextField,
possibleCompletionsForString string : String)