Objective-C
Swift

SwiftのコードをObjective-Cから呼んでみた

More than 3 years have passed since last update.

Githubレポジトリ

https://github.com/moriturus/swift_objc_bridge

Swiftのコード

Greeter.swift
import Foundation

class Greeter : NSObject
{
    var name : NSString
    var identifier : UInt

    // -initWithName:identifier:に自動変換される!!
    // @objc(initWithName:identifier:)とすれば明示可能
    init(name: String, identifier: UInt)
    {
        self.name = name
        self.identifier = identifier
    }

    func greet() -> Void
    {
        println("Hello, \(self.name). Your ID is \(self.identifier)")
    }

}

Objective-Cのコード

mixed-Bridging-Header.h
// mixedがモジュール名(プロジェクト名)、自動生成される
// 大嘘 *Bridging-Header.hはSwift側にObjective-Cのシグネチャを渡すためのヘッダっぽい

/*
#import "mixed-Swift.h"
*/
main.m
#import <Foundation/Foundation.h>

/*
#import "mixed-Bridging-Header.h"
*/

// *-Bridging-Header.hではなく
// こっちをインポート
#import "mixed-Swift.h"


int main(int argc, const char * argv[]) {

    @autoreleasepool {

        Greeter* greeter = [[Greeter alloc] initWithName:@"moriturus" identifier:42];
        [greeter greet];

    }

    return 0;
}

アウトプット

Hello, moriturus. Your ID is 42

バグ?

よくわかんないけどプロジェクトをクリーンしたらビルドできないようになった……

解決した

とりあえず~/Library/Developer/Xcode/DerivedDataのデータを削除
かつObjective-Cのコードを(Swiftのコードを読み込まないようにして)ビルド
再ビルド

バグレポバグレポ!

インポートするヘッダを間違えてたっぽい