Swift Academy · Урок

Взаимодействие с C и Objective-C вкратце (без особенностей iOS)

Импортируйте системные модули C, вызывайте простые API POSIX и C и используйте мосты Foundation (String/NSString, массивы и словари). Узнайте, как NSError** из Objective-C преобразуется в throws Swift.

Урок 2 из 38 шагов

«Взаимодействие с C и Objective-C вкратце (без особенностей iOS)» — бесплатный урок Swift Academy на CoddyKit. Это урок 2 из 3. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Swift Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Swift Academy содержит 3 уроков всего.

Карта взаимодействия

Краткий обзор взаимодействия:

  • C: импортируйте системные модули и вызывайте вспомогательные функции POSIX
  • Foundation: интеграция String/NSArray/NSDictionary
  • NSError → Swift выбрасывает ошибки

Импорты C и указатели

Swift может напрямую вызывать многие API C. Используйте условительный импорт для переносимости и преобразуйте 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, например arc4random_uniform в Apple-системах и random() в Linux. Делайте примеры небольшими и переносимыми.

#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)
#endif

Интеграция с Foundation

Типы 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 → выбрасывание ошибок

Параметры Objective-C NSError** импортируются как выбрасывающие ошибки. Используйте 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

Помечайте API Swift аннотациями @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

Быстрая проверка: как импортируются API NSError**?

Итоги

Итоги:

  • Импортируйте Darwin/Glibc и вызывайте простые API C.
  • Используйте интеграцию Foundation для строк и коллекций.
  • Objective-C NSError** преобразуется в Swift с выбрасыванием ошибок.
Можно начать бесплатно

Изучай Swift с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
122
Уроки
409

Часто задаваемые вопросы

Урок «Взаимодействие с C и Objective-C вкратце (без особенностей iOS)» бесплатный?

Да — полный текст урока «Взаимодействие с C и Objective-C вкратце (без особенностей iOS)» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Swift Academy, подпишись на CoddyKit PRO. Курс Swift Academy содержит 3 уроков всего.

Чему я научусь в уроке «Взаимодействие с C и Objective-C вкратце (без особенностей iOS)»?

Импортируйте системные модули C, вызывайте простые API POSIX и C и используйте мосты Foundation (String/NSString, массивы и словари). Узнайте, как NSError** из Objective-C преобразуется в throws Swif… Ты практикуешь Swift Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Swift Academy?

Предыдущий опыт не требуется. Swift Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 3.

Сколько времени занимает урок «Взаимодействие с C и Objective-C вкратце (без особенностей iOS)»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Swift Academy?

Да. Каждый урок Swift Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Скрипты Swift (shebang Swift) и инструменты командной строки
  2. Взаимодействие с C и Objective-C вкратце (без особенностей iOS)
  3. Упаковка двоичных файлов с помощью SPM
← Назад к Swift Academy