我想从AppDelegate调用一个用Swift编写的类函数(在Objective C中)。我究竟做错了什么?

时间:2015-08-27 13:43:12

标签: ios objective-c swift

我有一个swift文件“SomeController.swift”就像这样:

import Foundation

func performSomeStuff() {

println("Performing stuff")

}

现在在app委托中,我正在尝试这样做:(请注意,swift桥接标头已导入)

[SomeController performSomeStuff]

但它不起作用。

我也试过这个:

import Foundation

class SomeController:NSObject {

  class func performSomeStuff() {

     println("Performing stuff")

  }

}

但它仍然失败。

正确的方法是什么?

3 个答案:

答案 0 :(得分:1)

添加:

@objc

在swift代码中的class关键字之前,它将是:

@objc class SomeStuff: NSObject {

}

还要在要调用的任何函数前添加@obj。

然后在你的app委托中确保使用#import" projectName-Swift.h"

答案 1 :(得分:0)

您是否能够访问objective-c中的“SomeController”类,如果没有,则首先需要添加“$ {ProjectName} -Swift.h文件并在Build设置中添加Swift编译支持:

enter image description here

要访问从Swift到Objective-C的方法,请添加 进口基金会

class SomeStuff:NSObject {

  @objc class func performSomeStuff() {

     println("Performing stuff")

  }

}

在函数名称之前。

  

在某些情况下,您需要更精细地控制Swift API如何向Objective-C公开。如果您的Swift类不从Objective-C类继承,或者您希望在接口中更改符号的名称(因为它暴露给Objective-C代码),则可以使用@objc属性。

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html

答案 2 :(得分:0)

好的,我明白了。首先,这是正确的方法。就像你们中的一些人说的那样:

在swift文件中,我有这样的话:

class MyController:NSObject{

  class func performTask {
    // Here my task is running.
  }
} 

然后在app委托中,我只导入swift头文件。这样做:

[MyController performTask];

现在我错了。这对我来说是一个错误,但也许对那里的其他人有用。

当我第一次创建第一个swift文件时,我将它放在我的Source文件夹中的一个文件夹中。但是当我开始使用多个swift文件时,我将桥接头移到该文件夹​​之外并进入主Source文件夹(仅用于组织)。

问题是,它没有给我一个直接的错误告诉我是什么问题。我必须检查问题导航器以确定问题。

希望这可以帮助那些人。