Как вызвать Objective-C код из Swift
на новом языке Swift от Apple, как можно вызвать Objective-C code?
Apple упомянула, что они могут сосуществовать в одном приложении, но означает ли это, что можно технически повторно использовать старые классы, созданные в Objective-C, при создании новых классов в Swift?
Доводы
Objective-C является независимым от платформы языком, в то время как Swift зависит от платформы. Написание не зависящего от платформы кода (библиотеки бизнес-логики) в Swift так что не будь мудрым. Однако написание в нем зависящего от платформы кода (например, связанного с интерфейсом) было бы совершенно нормально. Не сказать, что это было бы хорошей идеей, однако это определенно интерес.
15 ответов:
использование классов Objective-C в Swift
** Если у вас есть существующий класс, который вы хотите использовать, выполнять Шаг 2 а затем перейти к Шаг 5. (В некоторых случаях мне пришлось добавить явное
#import <Foundation/Foundation.hк более старому файлу Objective-C.) **Шаг 1: Добавьте Реализацию Objective-C -- .м
добавить
.mфайл для вашего класса, и назовите егоCustomObject.m.Шаг 2: Добавьте Заголовок Моста
при добавлении
.mfile, вы, вероятно, будете поражены подсказкой, которая выглядит так:
клик да !
если вы не видели приглашение или случайно удалили свой заголовок моста, добавьте новый
.hфайл для вашего проекта и назовите его<#YourProjectName#>-Bridging-Header.h.в некоторых ситуациях, особенно при работе с фреймворками Objective-C, вы не добавляете класс Objective-C явно и Xcode не может найти компоновщик. В этом случае создайте свой
.hфайл с именем, как упоминалось выше, затем убедитесь, что вы связываете его путь в настройках проекта вашей цели следующим образом:
Примечание
лучше всего связать свой проект с помощью
$(SRCROOT)макрос, так что если вы перемещаете свой проект или работаете над ним с другими, используя удаленный репозиторий, он все равно будет работать.$(SRCROOT)можно рассматривать как каталог, содержащий .xcodeproj файл. Это может выглядеть так:$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.hШаг 3: Добавьте Заголовок Objective-C -- .h
добавить
.hфайл и назовите егоCustomObject.h.Шаг 4: Создайте свой класс Objective-C
на
CustomObject.h#import <Foundation/Foundation.h> @interface CustomObject : NSObject @property (strong, nonatomic) id someProperty; - (void) someMethod; @endна
CustomObject.m#import "CustomObject.h" @implementation CustomObject - (void) someMethod { NSLog(@"SomeMethod Ran"); } @endШаг 5: Добавьте класс В мост-заголовок
на
YourProject-Bridging-Header.h:#import "CustomObject.h"Шаг 6: используйте свой объект
In
SomeSwiftFile.swift:var instanceOfCustomObject: CustomObject = CustomObject() instanceOfCustomObject.someProperty = "Hello World" println(instanceOfCustomObject.someProperty) instanceOfCustomObject.someMethod()нет необходимости импортировать явно; это то, для чего предназначен заголовок моста.
использование Swift классов в Objective-C
Шаг 1: Создайте Новый Класс Swift
добавить
.swiftфайл для вашего проекта, и назовите егоMySwiftObject.swift.на
MySwiftObject.swift:import Foundation class MySwiftObject : NSObject { var someProperty: AnyObject = "Some Initializer Val" init() {} func someFunction(someArg:AnyObject) -> String { var returnVal = "You sent me \(someArg)" return returnVal } }Шаг 2: импорт файлов Swift в класс ObjC
на
SomeRandomClass.m:#import "<#YourProjectName#>-Swift.h"файл:
<#YourProjectName#>-Swift.hуже должен быть создан автоматически в вашем проекте, даже если вы его не видите.Шаг 3: используйте свой класс
MySwiftObject * myOb = [MySwiftObject new]; NSLog(@"MyOb.someProperty: %@", myOb.someProperty); myOb.someProperty = @"Hello World"; NSLog(@"MyOb.someProperty: %@", myOb.someProperty); NSString * retString = [myOb someFunction:@"Arg"]; NSLog(@"RetString: %@", retString);Примечание:
1. CodeCompletion вел себя не так точно, как мне бы хотелось. В моей системе запуск быстрой сборки с помощью "cmd + r", казалось, помог Swift найти часть кода Objective-C и наоборот.
2. если вы добавляете
.swiftфайл в старый проект и получить ошибку:dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib, полностью попробовать перезапуск Xcode версии.3. хотя первоначально можно было использовать чистые классы Swift в Objective-C с помощью
@objcпрефикс, после Swift 2.0, это больше не возможно. См. раздел редактирование истории для первоначального объяснения. Если эта функция будет повторно включена в будущих версиях Swift, ответ будет обновлен соответствующим образом.
смотрите руководство Apple по использование Swift с какао и Objective-C. В этом руководстве описывается, как использовать код Objective-C и C из Swift и наоборот, и содержатся рекомендации по преобразованию проекта или смешиванию и сопоставлению частей Objective-C/C и Swift в существующем проекте.
компилятор автоматически генерирует синтаксис Swift для вызова функций C и методов Objective-C. Как видно из документации, эта цель-C:
UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];превращается в это Swift код:
let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)Xcode также делает этот перевод на лету - вы можете использовать Open быстро при редактировании файла Swift и ввести имя класса Objective-C, и это приведет вас к Swift-ified версии заголовка класса. (Вы также можете получить это, щелкнув cmd на символе API в файле Swift.) И вся справочная документация API в iOS 8 и OS X v10. 10 (Yosemite) библиотеки разработчиков видны как в Objective-C, так и в Swift формах (например
UIView).
вот пошаговые инструкции по использованию кода Objective-C (в данном случае фреймворк, предоставленный третьей стороной) в проекте Swift:
- добавьте любой файл Objective-C в свой проект Swift выберите Файл -> Создать -> новый файл -> цель-C файл. При спасении,Xcode спросит, хотите ли вы добавить заголовок моста. Выберите'да'. Gif: добавление пустого файла в проект и создание заголовка моста http://www.derrrick.com/stackoverflow/1-empty-file.gif
в простых шагов:
появится приглашение, а затем нажмите кнопку ОК... Если он не появится, то мы создаем его вручную, как в следующем... Создайте один файл заголовка из источника iOS и дайте имя ProjectName-Bridging-Header (пример: Test-Bridging-Header), а затем перейдите к настройке сборки в коде компилятора Swift - > Objective-C bridge add Objective-C bridge name ..(Тест/Испытание-Преодоление-Заголовка.ч.) Да, это все.
при необходимости удалите файл Objective-C, который вы добавили (с именем "что-нибудь" в изображении GIF выше). Тебе это больше не нужно.
откройте файл заголовка моста -- имя файла имеет вид [YourProject]-Мост-Заголовок.h. Он включает в себя комментарий, предоставленный Xcode. добавьте строку кода для файла Objective-C, который вы хотите включить, например сторонний фреймворк. Например, чтобы добавить Mixpanel в свой проект, вам нужно будет добавить следующую строку кода в файл заголовка моста:
#import "Mixpanel.h"теперь в любом Swift файле вы можете используйте существующий код Objective-C, в синтаксисе Swift (в случае этого примера, и вы можете вызывать методы компании Mixpanel СДК и т. д.). Вам нужно ознакомиться с тем, как Xcode переводит Objective-C в Swift. руководство Apple быстро читать. Или см. этот ответ для неполного резюме.
пример для Mixpanel:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { Mixpanel.sharedInstanceWithToken("your-token") return true }вот именно!
Примечание: если вы удалите файл заголовка моста из вашего проекта обязательно зайдите в настройки сборки и удалить значения "Objective-C Bridging Header " под "Swift компилятор-генерация кода".
вы можете прочитать хороший пост Swift & Cocoapods. В принципе, нам нужно создать файл заголовка моста и поместить туда все заголовки Objective-C. И тогда нам нужно ссылаться на него из наших настроек сборки. После этого мы можем использовать объективные-C код.
let manager = AFHTTPRequestOperationManager() manager.GET( "http://example.com/resources.json", parameters: nil, success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in println("JSON: " + responseObject.description) }, failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in println("Error: " + error.localizedDescription) })также взгляните на документ Apple использование Swift с какао и Objective-C как хорошо.
Я написал простой проект Xcode 6, который показывает, как смешивать C++, Objective-C и Swift код:
https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console
в частности, пример вызывает функцию Objective-C и C++ из Swift.
ключ должен создать общий заголовок, Project-Bridging-Header.h, и поместите туда заголовки Objective-C.
пожалуйста, скачать проект как пример.
цитата документация:
любая структура Objective-C (или библиотека C), доступная как модуль можно импортировать непосредственно в Swift. Это включает в себя все Цель-c системные структуры-такие как Foundation, UIKit и SpriteKit-а также общие библиотеки C, поставляемые с системой. Для например, чтобы импортировать Foundation, просто добавьте этот оператор импорта в в верхней части файла Swift, в котором вы работаете:
import Foundationэтот импорт делает все API Foundation-включая NSDate, NSURL, NSMutableData, и все их методы, свойства и категории-непосредственно в Swift.
еще одна вещь я хотел бы добавить здесь:
я очень благодарен ответу @Logan. Это очень помогает создать файл моста и настройки.
но после выполнения всех этих шагов я все еще не получаю класс Objective-C в Swift.
я использовал
cocoapodsбиблиотеки и интегрировать его в мой проект. А этоpod "pop".так что если вы используете Objective-C стручки в Swift, то может быть шанс, что вы не можете получить или
importв классы в Swift.простая вещь, которую вы должны сделать, это:
- на
<YOUR-PROJECT>-Bridging-Headerфайл и- заменить заявление
#import <ObjC_Framework>до@import ObjC_Frameworkнапример: (Pop library)
заменить
#import <pop/POP.h>С
@import pop;использовать
clang import, когда#importне работает.
просто Примечание Для тех, кто пытается добавить библиотеку Objective-C в Swift: вы должны добавить - ObjC на Параметры Построения ->связь ->Другие Флаги Компоновщика.
нажмите на кнопку New меню Файл, и выберите Файл выберите язык цели. В это время он автоматически генерирует файл "Objective-C Bridging Header", который используется для определения имени некоторого класса.
" Objective-C Bridging Header "в разделе"Swift Compiler - Code Generation".
- создать a .H-файл из файл -> источник -> заголовочный файл
- затем сохраните имя файла Your_Target_Name-Bridging-Header.h люди здесь получают общую ошибку, принимая их имя проекта, но это должно быть имя цели проекта, если в случае, если оба они разные, как правило, они одинаковы.
- затем в настройках сборки найдите Objective-C Bridging Header флаг и поставить адрес вашего вновь созданного файла моста, вы можете сделать это щелкните правой кнопкой мыши на файл - > показать в finder - > перетащите файл в текстовую область, то адрес будет заполнен.
- используя #import Your_Objective-C_file.h
- в файле swift вы можете получить доступ к файлу ObjC, но только на языке swift.
любая платформа Objective-C (или библиотека C), доступная как модуль, может быть импортирована непосредственно в Swift. Это включает в себя все системные фреймворки Objective-C, такие как Foundation, UIKit и SpriteKit, а также общие библиотеки C, поставляемые с системой. Например, чтобы импортировать Foundation, просто добавьте этот оператор импорта в верхнюю часть Swift-файла, в котором вы работаете:
import Foundationэтот импорт делает все API Foundation-включая NSDate, NSURL, NSMutableData, и все их методы, свойства и категории-непосредственно доступны в Swift.
Я взял это из документации Apple.
двусторонний подход к использованию objective-c objective-c
1
1. Create bridge-header.h file in Xcode Project 2. import .h file in bridge-Header file 3. Set path of bridge-Header in Build settings. 3. Clean the Project2
1. Create objective-c files in project(it automatically set path in Build Settings for you ) 2. import .h file in bridge-Header fileТеперь хорошо идти спасибо
в проекте Swift 4.2 в Xcode 9.4 вы можете легко добавить файл Objective-C. Выполните следующие действия, чтобы связать файл Objective-C с проектом Swift.
Step_01: создание нового проекта Xcode с использованием языка Swift:
File>New>Project>objc.Step_02: в Swift project добавьте новый файл Objective-C:
File>New>File...>macOS>Objective-C File.Step_03: если вы добавляете новый файл Objective-C в Swift project в самый первый раз, Xcode спрашивает вас:
Would you like to configure an Objective-C bridging header?Step_04: выберите опцию:
Create Bridging Header.Step_05: будет создан соответствующий файл с именем:
Objc-Bridging-Header.h.Step_06: теперь вам нужно установить путь к файлу моста в заголовке моста. В Навигаторе Проектов нажмите на проект с именем
objcи выберите:
Build Settings>Objective-C Bridging Header>Objc-Bridging-Header.h.Step_07: перетащите ваш
Objc-Bridging-Header.hв это поле для создания пути к файлу.Step_08: откройте
Objc-Bridging-Header.hфайл и импортируйте файл Objective-C, который вы хотите использовать в своем Swift-файле.#import "SpecialObjcFile.m"тут контент
SpecialObjcFile.m:#import <Foundation/Foundation.h> @interface Person: NSObject { @public bool busy; } @property bool busy; @endStep_09: теперь в вашем Swift файл, Вы можете использовать класс Objective-C:
override func viewDidLoad() { super.viewDidLoad() let myObjcContent = Person() print(myObjcContent.busy) }









Comments