试图实现Objective-C协议的Swift类因可选方法冲突错误而失败

时间:2016-04-18 13:25:50

标签: ios objective-c swift

我有一个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协议时指出一些关于如何映射各种类型(数组,回调等)的一般规则或参考。

2 个答案:

答案 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)