C/Obj-C相互運用の概要(iOS固有の内容なし)
Cのシステムモジュールをインポートし、シンプルなPOSIX/C APIを呼び出します。Foundationのブリッジ(String/NSString、配列/辞書)も使います。Objective-Cの NSError** がSwiftの throws になる仕組みを確認します。
「C/Obj-C相互運用の概要(iOS固有の内容なし)」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン2/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全3レッスンが含まれています。
相互運用マップ
ここでは相互運用について簡単に見ていきます:
- C:システムモジュールをインポートしてPOSIXヘルパーを呼び出します
- Foundation:String/NSArray/NSDictionaryのブリッジ
- NSError → Swiftのthrows
Cのインポートとポインター
Swiftから多くのC APIを直接呼び出せます。移植性のために条件付きインポートを使い、char*はString(cString:)で変換します。
// Import the platform C module: Darwin (Apple) or Glibc (Linux)
#if canImport(Darwin)
import Darwin
#else
import Glibc
#endif
// Use C getenv (returns C pointer) and strlen
if let cPtr = getenv("USER") {
let name = String(cString: cPtr) // bridge C char* -> Swift String
print("Hello,", name)
} else {
print("Hello, anonymous")
}
// strlen works on C strings:
let cString: [CChar] = Array("swift".utf8).map { CChar($0) } + [0]
let len = strlen(cString)
print("strlen(s) =", len)Cの乱数の例
プラットフォームのC関数(Appleではarc4random_uniform、Linuxではrandom()など)を呼び出します。例は小さく、移植性のあるものにしてください。
#if canImport(Darwin)
import Darwin
let r = arc4random_uniform(100) // 0..99
print("random:", r)
#else
import Glibc
let r = UInt32(random() % 100) // 0..99 (demo)
print("random:", r)
#endifFoundationのブリッジ
Foundationの型は自然にブリッジされます:String⇄NSString、[Any]⇄NSArray、[Key:Any]⇄NSDictionary。
import Foundation
// String ↔ NSString bridge is seamless
let swiftString: String = "hello"
let ns: NSString = swiftString as NSString
print(ns.uppercased) // via NSString API
let back: String = ns as String
print(back + " world")
// NSArray / NSDictionary bridge to Swift collections
let nsArray: NSArray = ["a", "b", "c"]
let swiftArray = nsArray as! [String]
print(swiftArray.joined(separator: ","))
let nsDict: NSDictionary = ["lang": "Swift", "year": 2014]
let swiftDict = nsDict as! [String: Any]
print(swiftDict["lang"] as? String ?? "-")NSError → throws
Objective-CのNSError**パラメーターはthrowsとしてインポートされます。try/do-catchを使えば、手動でポインターを扱う必要はありません。
import Foundation
// Many Obj-C methods that take NSError** are imported as throwing in Swift.
let fm = FileManager.default
// Create a temporary file, then remove it with "try".
let tmp = (NSTemporaryDirectory() as NSString).appendingPathComponent("demo.txt")
FileManager.default.createFile(atPath: tmp, contents: Data("hi".utf8), attributes: nil)
do {
try fm.removeItem(atPath: tmp) // was NSError** in Obj-C → throws in Swift
print("removed ok")
} catch {
print("remove failed:", error)
}SwiftをObj-Cに公開する
Swift APIに@objc/@objcMembersのアノテーションを付け(NSObjectを継承して)、混在するコードベースでObjective-Cから利用できるようにします。
import Foundation
@objcMembers
class Adder: NSObject {
dynamic var last: Int = 0
@objc func add(_ a: Int, _ b: Int) -> Int { last = a + b; return last }
}
let a = Adder()
print(a.add(2, 3)) // 5
print(a.last) // 5
// In mixed projects, Obj-C can call Adder via the generated Swift header.NSErrorブリッジの回答
確認問題:NSError** APIはどのようにインポートされますか?
まとめ
まとめ:
- Darwin/Glibcをインポートして、単純なC APIを呼び出します。
- 文字列やコレクションにはFoundationのブリッジを使います。
- Objective-CのNSError**はSwiftのthrowsに対応します。
よくある質問
「C/Obj-C相互運用の概要(iOS固有の内容なし)」レッスンは無料ですか?
はい。「C/Obj-C相互運用の概要(iOS固有の内容なし)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全3レッスンが含まれています。
「C/Obj-C相互運用の概要(iOS固有の内容なし)」で何を学びますか?
Cのシステムモジュールをインポートし、シンプルなPOSIX/C APIを呼び出します。Foundationのブリッジ(String/NSString、配列/辞書)も使います。Objective-Cの NSError** がSwiftの throws になる仕組みを確認します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/3です。
「C/Obj-C相互運用の概要(iOS固有の内容なし)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Swiftスクリプト(swift shebang)とコマンドラインツール
- C/Obj-C相互運用の概要(iOS固有の内容なし)
- SPMでバイナリをパッケージ化する