Objective-C项目中的Swift类(编译器错误)

时间:2015-08-19 09:36:00

标签: ios objective-c swift

我在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课程中遇到这两个错误?如何修复它们?

2 个答案:

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

由于以下原因,这是不正确的: -

    初始方法不允许
  1. func
  2. init方法不应声明返回类型,请删除-> AnyObject
  3. init方法不返回任何内容,从super.init中删除return关键字......
  4. Swift初始化程序do not return a value但是您仍然可以将结果分配给变量:

    夫特:

    var mySubTask = SubTask(homeworks: someDictionary)
    

    目标-C:

    SubTask *mySubTask = [[SubTask alloc] initWithHomeworks:someDictionary];