【问题标题】:Syntax to Call Swift Method from Objective-C Class从 Objective-C 类调用 Swift 方法的语法
【发布时间】:2019-02-03 19:27:18
【问题描述】:

我正在尝试从objective-c 文件中调用以swift 编写的实用程序文件中的一些代码。

现在 swift 文件中的类如下所示:

class ImageClass: NSObject {
public func imageFromString(name: String?) -> UIImage? {
//code to make image

return image
}
}

我试图从 Objective-C 文件中调用它:

 UIImage *myImage = [ImageClass imageFromString:@"test"];

但是这给出了错误:

Use of undeclared identifier 'ImageClass'

我知道 Utilities 文件可以从 Objective-C 文件中访问,因为我使用共享实例调用了那里的其他方法。

谁能建议调用代码的正确方法?我实际上不在乎它是一个类还是通过一个 sharedInstance,我只需要能够调用它。

编辑:

根据@Charles Srstka 的建议,我 CMD 单击了#import myapp.swift 文件,跳转到定义,它在标题中显示以下内容:

- (UIImage * _Nullable)imageFromStringWithName:(NSString * _Nullable)name SWIFT_WARN_UNUSED_RESULT;

因此,我尝试将 WithName(我忘记了)添加到调用中,所以我有:

 UIImage *myImage = [ImageClass imageFromStringWithName:@"test"];

但在方法之前使用或不使用@objc 时仍然会出错:

No known class method for selector 'imageFromStringWithName:'

【问题讨论】:

    标签: ios objective-c swift class


    【解决方案1】:

    在 swift 4.2 和最新版本中

    1. 将此行添加到您的“*.m”文件中:

      #import "YourProjectName-Swift.h"
      
    2. 在你的函数前添加@objc:

      @objc public func imageFromString(name: String?) -> UIImage? {    
      //code to make the image
      return image
      }
      
    3. 在 Objective-C 类中调用它:

      ImageClass *imgObject = [[ImageClass alloc] init];   
      UIImage *myImage = [imgObject imageFromStringWithName:@"test"];
      

    【讨论】:

    • 这完成了工作。关键是在调用类方法之前启动 NSObject。谢谢。
    【解决方案2】:

    将此行添加到您的 Objective-C 文件中:

    #import "YourProjectName-Swift.h"
    

    YourProjectName 替换为您的项目名称。这将使您的项目中所有与 Objective-C 兼容的 Swift 类对您的 Objective-C 代码可见。

    请注意,您还需要将 @objc 注释添加到您的 func 声明中,以使这些方法对 Objective-C 可见。

    【讨论】:

    • 我已经有了导入声明。我在函数行中的 public 之前添加了@objc,但得到了同样的错误。
    • 如果您在#import 行上单击命令,您应该能够看到生成的头文件。你的班级出现在那里吗?
    • 我尝试了您的建议,我已将其放入上面的编辑中。好像那里有一个方法,但我仍然没有正确调用它
    • @user1904273 您的问题是您需要实例化对象(如果它是 class func 而不是常规的 func,您可以按照您的方式调用它),但我看到有人否则已经得到了那个。但是,如果你想修正那个笨拙的方法名,你可以将方法声明为func image(string name: String?),这将在Objective-C 中显示为imageWithString:,或者你可以使用func imageFromString(_ name: String?),它将显示为imageFromString:。如果您愿意,也可以在 func 上添加 @objc(whateverTheHellYouWantToCallIt:) 注释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2015-07-10
    • 1970-01-01
    • 2015-03-28
    相关资源
    最近更新 更多