我在Objective-C项目中创建了一个Swift类。在objective-c和swift之间生成的桥接接口没有问题。
在我的objective-c项目中,我有一个名为Task
的类,其Task.h
如下所示:
@interface Task: NSObject
…
- (id) initWithHomeworks:(NSDictionary *)homeworks
@end
Task.m 如下所示:
@implementation Task
- (id) initWithHomeworks:(NSDictionary *)settings {
self = [super init];
//Do something with self...
...
return self
}
我的swift代码继承了上面的类:
import Foundation
class SubTask : Task {
//Compiler Error 1
func initWithHomeworks(homeworks: Dictionary<String, String>) -> AnyObject{
//Compiler Error 2
return super.initWithSettings(settings)
}
}
我在上面评论的地方遇到两个编译器错误。错误消息如下:
编译器错误1:
Method ‘initWithHomeworks’ with Objective-C selector ‘initWithHomeworks:’ conflicts with initializer ‘init(homework:)’ from superclass ‘Task’ with the same Objective-C selector
(我没有声明任何方法init(homework:)
)
编译器错误2:
‘Task’ does not have a member named ‘initWithHomeworks’
为什么我在Swift课程中遇到这两个错误?如何修复它们?
答案 0 :(得分:0)
如果要覆盖init方法,则应该像这样写
class SubTask:Task{
override init!(homeworks: [NSObject : AnyObject]!) {
super.init(homeworks: homeworks)
}
}
答案 1 :(得分:0)
您看到的根本原因是Swift智能地转换Objective-C方法名称。 From the docs:
要在Swift中实例化一个Objective-C类,你可以调用其中的一个 使用Swift语法的初始化程序。当Objective-C init方法到来时 转到Swift,它们采用原生的Swift初始化语法。该 “init”前缀被切掉并成为一个关键字来表示 该方法是初始化程序。对于以。开头的init方法 “initWith”,“With”也被切掉了。的第一个字母 具有“init”或“initWith”分离的选择器片段变为 小写,并将该选择器片段视为第一个的名称 论点。其余的选择器部分也对应于参数 名。每个选择器都在括号内,是必需的 在通话现场。
在您的情况下,Objective-C initWithHomeworks:(NSDictionary *)homeworks
方法将转换为Swift init(homeworks: [NSObject : AnyObject]!)
。您可以按如下方式覆盖它:
给定Objective-C标题:
@interface Task : NSObject
- (id)initWithHomeworks:(NSDictionary *)homeworks;
@end
Swift子类:
class SubTask : Task {
override init!(homeworks: [NSObject : AnyObject]!) {
super.init(homeworks: homeworks)
}
}
在Xcode 6.4中使用Swift 1.2完成了这个答案
根据评论进行更新
您已将SubTask的初始化程序定义为常规函数:
func initWithHomeworks(homeworks: Dictionary<String, String>) -> AnyObject{
return super.initWithSettings(settings)
}
由于以下原因,这是不正确的: -
func
-> AnyObject
return
关键字...... Swift初始化程序do not return a value但是您仍然可以将结果分配给变量:
夫特:
var mySubTask = SubTask(homeworks: someDictionary)
目标-C:
SubTask *mySubTask = [[SubTask alloc] initWithHomeworks:someDictionary];