Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I expose a Swift global function to Objective-C? [duplicate]

the documentation says:

Global constants defined in C and Objective-C source files are automatically imported by the Swift compiler as Swift global constants.

But it doesn't say anything about the other way around. I need to define a global swift constant and be able to see it one the objective c side like a global c constant. Like on the swift side define:

public let CARDS = ["card1", "card2"]

and see use it on the objective c side like

NSLog(@"Cards count: %d", [CARDS count])

What should I do? I've already imported the swift automatically generated header like:

#import "MyProject-Swift.h"

and in Xcode if I command-click on it, it takes me to the correct place in the swift code, but at compile time I get:

'User of undeclared Identifier CARDS'

on my objective c side.

like image 792
Ali Avatar asked Nov 19 '22 22:11

Ali


1 Answers

Here is the document about it

You’ll have access to anything within a class or protocol that’s marked with the @objc attribute as long as it’s compatible with Objective-C. This excludes Swift-only features such as those listed here:

  • Generics
  • Tuples
  • Enumerations defined in Swift
  • Structures defined in Swift
  • Top-level functions defined in Swift
  • Global variables defined in Swift
  • Typealiases defined in Swift
  • Swift-style variadics
  • Nested types
  • Curried functions

Global variables (including constants) are unaccessible from Objective-C.

Instead, you have to declare a class which has accessors for the global constants.

// Swift
public let CARDS = ["card1", "card2"]

@objc class AppConstant {
   private init() {}
   class func cards() -> [String] { return CARDS }
}

// Objective-C
NSArray *cards = [AppConstant cards];
like image 75
rintaro Avatar answered Dec 06 '22 03:12

rintaro