I am trying to call some code in a Utilities file written in swift from an objective-c file.
Right now the class in the swift file looks like this:
class ImageClass: NSObject {
public func imageFromString(name: String?) -> UIImage? {
//code to make image
return image
}
}
I am trying to call it from the Objective-C file with:
UIImage *myImage = [ImageClass imageFromString:@"test"];
however this is giving error:
Use of undeclared identifier 'ImageClass'
I know the Utilities file is reachable from the Objective-C file because I call other methods there though using a shared Instance.
Can anyone suggest the proper way to call the code? I actually don't care if it's a class or through a sharedInstance, I just need to be able to call it.
Edit:
As suggested by @Charles Srstka, I CMD-clicked on the #import myapp.swift
file, jumped to Definition, and it shows the following in the header:
- (UIImage * _Nullable)imageFromStringWithName:(NSString * _Nullable)name SWIFT_WARN_UNUSED_RESULT;
Accordingly, I tried adding WithName (which I'd forgotten) to the invocation so I have:
UIImage *myImage = [ImageClass imageFromStringWithName:@"test"];
but am still getting error with or without @objc before method:
No known class method for selector 'imageFromStringWithName:'
In swift 4.2 and latest
Add this line to your "*.m" file:
#import "YourProjectName-Swift.h"
Add @objc before your function:
@objc public func imageFromString(name: String?) -> UIImage? { //code to make the image return image }
Call it inside Objective-C class:
ImageClass *imgObject = [[ImageClass alloc] init]; UIImage *myImage = [imgObject imageFromStringWithName:@"test"];
Add this line to your Objective-C file:
#import "YourProjectName-Swift.h"
Replace YourProjectName
with the name of your project. This will make all the Objective-C-compatible Swift classes in your project visible to your Objective-C code.
Note that you'll also need to add the @objc
annotation to your func
declataions to make the methods visible to Objective-C.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.