0Pricing
Objective-C iOS Development for Legacy & Enterprise Apps · レッスン

SwiftとObjective-Cのブリッジ

自動生成されるObjective-C generated headerを通じて、SwiftコードをObjective-Cから利用できるようにする方法を学びます。

「SwiftとObjective-Cのブリッジ」はCoddyKit上の無料Objective-C iOS Development for Legacy & Enterprise Appsレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはObjective-C iOS Development for Legacy & Enterprise Apps学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Objective-C iOS Development for Legacy & Enterprise Appsコースには全4レッスンが含まれています。

このレッスンの一部はまだ翻訳されておらず、英語で表示されています。

Swift to Obj-C: The Bridge

Welcome! In mixed-language projects, you often need Swift code to talk to Objective-C code. This lesson focuses on making your modern Swift classes and methods accessible to older Objective-C files.

This "bridging" allows you to gradually introduce Swift into an existing Objective-C codebase or have parts of your app written in different languages.

The Auto-Generated Header

When you add Swift files to an Objective-C project, Xcode automatically generates a special header file for you. It's named ProductModuleName-Swift.h.

This header acts as a translator, exposing your Swift code to the Objective-C world. You don't create it; Xcode does all the work! You just need to import it.

Exposing Swift Classes

For an Objective-C file to "see" a Swift class, that Swift class must inherit from NSObject. This is a fundamental requirement for Objective-C compatibility.

Without inheriting from NSObject, your Swift class won't appear in the auto-generated bridging header.

Using @objc for Visibility

The @objc attribute explicitly marks a Swift declaration (class, method, property, initializer) as available to Objective-C.

  • Classes that inherit from NSObject and are not final automatically expose their members.
  • You might need @objc for specific members if your class doesn't inherit from NSObject (e.g., via a protocol) or for properties/methods that require KVC/KVO compatibility.

A Simple Swift Class

Here's a Swift class, MySwiftGreeter, that inherits from NSObject. Its name property and greet() method will be automatically exposed to Objective-C.

We can optionally use @objc(MySwiftGreeter) to specify the Objective-C name, though it's often inferred.

import Foundation

class MySwiftGreeter: NSObject {
    @objc var name: String

    @objc init(name: String) {
        self.name = name
        super.init()
    }

    @objc func greet() -> String {
        return "Hello from Swift, \(name)!"
    }
}

Importing the Swift Header

To use your Swift classes in an Objective-C file, you simply need to import the auto-generated bridging header. Replace ProductModuleName with your project's actual module name.

This import should be in your Objective-C .m implementation file, not in a .h header file, to avoid circular dependencies and unnecessary exposure.

// In MyObjectiveCFile.m
#import "YourProjectName-Swift.h"

// Now you can use MySwiftGreeter
// ...

Using Swift in Obj-C

Once the bridging header is imported, your Objective-C code can create instances of Swift classes and interact with their exposed properties and methods, just like any other Objective-C object.

Note: This code snippet shows how it would look in a project. Running it directly requires a full Xcode project setup with both Swift and Objective-C files.

#import <Foundation/Foundation.h>
#import "MyProjectName-Swift.h" // Your project's auto-generated header

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // Create an instance of the Swift class
        MySwiftGreeter *greeter = [[MySwiftGreeter alloc] initWithName:@"Coddy"];

        // Call a method on the Swift object
        NSString *greeting = [greeter greet];
        NSLog(@"%@", greeting);

        // Access a property
        NSLog(@"Greeter's name: %@", greeter.name);
    }
    return 0;
}

Swift & Obj-C Type Map

When bridging, Swift types are automatically mapped to their closest Objective-C equivalents:

  • Swift String maps to NSString*
  • Swift Int, Double, Bool map to NSNumber*
  • Swift Array maps to NSArray*
  • Swift Dictionary maps to NSDictionary*

This allows seamless data exchange between the two languages.

Customizing Obj-C Names

Sometimes, Swift's inferred Objective-C name for a class or method might not be ideal, or it might conflict. You can provide a custom Objective-C name using @objc(NewName).

This is especially useful if you need to match existing Objective-C naming conventions or avoid clashes with existing Objective-C symbols.

import Foundation

@objc(LegacyGreeter) // Renames MySwiftGreeter to LegacyGreeter for Obj-C
class MySwiftGreeter: NSObject {
    @objc var name: String

    @objc(initWithPersonName:) // Custom name for initializer
    init(name: String) {
        self.name = name
        super.init()
    }

    @objc(sayHello) // Custom name for method
    func greet() -> String {
        return "Hello from Swift, \(name)!"
    }
}

Bridging Limitations

Not all Swift features can be directly exposed to Objective-C. Keep these limitations in mind:

  • Swift Structs & Enums: Unless they have raw values and conform to @objc, they aren't directly visible.
  • Generics: Swift generics are not exposed.
  • Global Functions: Only methods within NSObject-derived classes are bridged.
  • Tuples: Swift tuples have no Objective-C equivalent.

Focus on classes, methods, and properties that mirror Objective-C's object model.

Bridging Knowledge Check

Which of the following is REQUIRED for a Swift class to be accessible from Objective-C code via the auto-generated bridging header?

Bridging Swift to Obj-C

You've learned how to make your Swift code available to Objective-C! Key takeaways:

  • Xcode generates a ProductModuleName-Swift.h header.
  • Swift classes must inherit from NSObject to be seen by Objective-C.
  • The @objc attribute explicitly exposes members or renames them.
  • Swift types like String, Array, and Dictionary are automatically mapped to their NS counterparts.

This bridging is crucial for maintaining and evolving mixed-language iOS projects!

よくある質問

「SwiftとObjective-Cのブリッジ」レッスンは無料ですか?

はい。「SwiftとObjective-Cのブリッジ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Objective-C iOS Development for Legacy & Enterprise Appsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Objective-C iOS Development for Legacy & Enterprise Appsコースには全4レッスンが含まれています。

「SwiftとObjective-Cのブリッジ」で何を学びますか?

自動生成されるObjective-C generated headerを通じて、SwiftコードをObjective-Cから利用できるようにする方法を学びます。 ブラウザで直接実行するハンズオンコードでObjective-C iOS Development for Legacy & Enterprise Appsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Objective-C iOS Development for Legacy & Enterprise Appsを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのObjective-C iOS Development for Legacy & Enterprise Appsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「SwiftとObjective-Cのブリッジ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このObjective-C iOS Development for Legacy & Enterprise Appsレッスンでコードを書いて実行できますか?

はい。すべてのObjective-C iOS Development for Legacy & Enterprise Appsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Objective-CとSwiftのブリッジ
  2. SwiftとObjective-Cのブリッジ
  3. Objective-Cフレームワークの作成
  4. ブリッジ間のNullabilityと型マッピング
← Objective-C iOS Development for Legacy & Enterprise Appsに戻る