Làm cách nào tôi có thể nhập mã Swift vào Objective-C?


281

Tôi đã viết một thư viện bằng Swift và tôi không thể nhập nó vào dự án hiện tại của mình, được viết bằng Objective-C.

Có cách nào để nhập nó không?

#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found

9
thích dự án này!
SleepsOnNewspapers

Câu trả lời:


430

Bạn cần nhập TargetName-Swift.h. Lưu ý rằng đó là tên mục tiêu - các câu trả lời khác mắc lỗi sử dụng tên lớp.

Tệp đơn này là một tiêu đề được tạo tự động, xác định các giao diện Objective-C cho tất cả các lớp Swift trong dự án của bạn được chú thích @objchoặc kế thừa từ đó NSObject.

Cân nhắc:

  • Nếu tên mục tiêu của bạn chứa khoảng trắng, hãy thay thế chúng bằng dấu gạch dưới (ví dụ: My Projecttrở thành My_Project-Swift.h)

  • Nếu mục tiêu của bạn là một khung, bạn cần nhập <TargetName/TargetName-Swift.h>

  • Đảm bảo tệp Swift của bạn là thành viên của mục tiêu


5
Lưu ý rằng nếu bạn cố gắng sử dụng tên tệp Swift trong quá trình nhập của mình, bạn sẽ gặp lỗi "Dự kiến ​​';' sau khi khai báo cấp cao nhất ". trong tệp Swift của bạn sau khi "nhập Foundation".
louielouie

8
EDIT: Lưu ý: để làm việc này, tên mô-đun dự án PHẢI được xác định. Xem: stackoverflow.com/a/24064015/2085743
Ruben Martinez Jr.

7
Tôi chỉ muốn thêm một lưu ý rằng nếu tên dự án của bạn có bất kỳ khoảng trắng hoặc ký tự đặc biệt nào, bạn phải thay thế chúng bằng dấu gạch dưới, như "Ứng dụng của tôi" sẽ là "My_App-Swift.h"
Hola Soy Edu Feliz Navidad

84
Tại sao điều này rất khó khăn và tài liệu kém?
uchuugaka

3
@lelelo Không, tập tin đó ngược lại với tập tin này. Tiêu đề bắc cầu được viết bởi nhà phát triển và cho phép bạn mang các ký hiệu Objective-C và C vào mã Swift của mình. Tệp Target-Swift.h được tạo tự động và cho phép mã Objective-C / C của bạn truy cập các ký hiệu Swift.
Bill

154

Hướng dẫn từ trang web của Apple:

Để nhập mã Swift vào Objective-C từ cùng một khung

Trong Cài đặt bản dựng , trong Bao bì , đảm bảo cài đặt Mô-đun xác định cho mục tiêu khung đó được đặt thành . Nhập mã Swift từ mục tiêu khung đó vào bất kỳ tệp Objective-C .m nào trong mục tiêu khung đó bằng cú pháp này và thay thế các tên thích hợp:

#import "Tên sản phẩm-Swift.h"

Sửa đổi:

Bạn chỉ có thể nhập "ProductName-Swift.h" trong tệp .m.

Các tệp Swift trong mục tiêu của bạn sẽ hiển thị trong các tệp Objective-C .m có chứa câu lệnh nhập này.

Để tránh các tham chiếu theo chu kỳ, không nhập Swift vào tệp tiêu đề Objective-C. Thay vào đó, bạn có thể chuyển tiếp khai báo một lớp Swift để sử dụng nó trong tiêu đề Objective-C. Lưu ý rằng bạn không thể phân lớp một lớp Swift trong Objective-C.

nhập mô tả hình ảnh ở đây


2
Chỉ nhập "ProductName-Swift.h" trong các tệp .m đã giúp tôi. Việc thêm cùng một tệp .pch đã cho "Không thể tìm thấy khai báo giao thức cho 'CLLocationManagerDelegate'; ý bạn là 'NSLayoutManagerDelegate'?"
Alphonse R. Dsouza

@AJit nó không trực tiếp, tài liệu nói rằng. Cách dễ nhất là tạo một lớp Objective-C dịch theo định dạng mà Objective-C ++ hiểu. developer.apple.com/l
Alejandro Iván

1
Lưu ý rằng bạn phải xuất phát từ NSObject!!! bạn không thể chỉ cần tuyên bố một cách class Blah nhanh chóng và làm cho nó hoạt động. nó cần phải làclass Blah : NSObject
David T.

Đáng đọc câu trả lời này cho một số trường hợp: stackoverflow.com/questions/26328034/ nguồn Tùy thuộc vào những gì bạn đang làm: #import <ProductName / ProductModuleName-Swift.h> #import <ProductModuleName-Swift.h> #import <NewTestApp / NewTestApp -Swift.h>
inigo333

Nếu bạn muốn nhập tiện ích mở rộng Swift thì sao?
Ricardo

150

Đây là những gì để làm:

  1. Tạo một dự án mới trong Objective-C

  2. Tạo một .swifttập tin   mới

    • Một cửa sổ bật lên sẽ xuất hiện và hỏi "Bạn có muốn định cấu hình Tiêu đề cầu nối Objective-C không" .
    • Chọn .
  3. Nhấp vào tệp Dự án Xcode của bạn

  4. Nhấp vào Cài đặt bản dựng

  5. Tìm thanh Tìm kiếm và tìm kiếm Mô-đun Xác định .

  6. Thay đổi giá trị thành .

  7. Tìm kiếm Tên mô-đun sản phẩm .

  8. Thay đổi giá trị thành tên của dự án của bạn.

  9. Trong đại biểu ứng dụng, thêm vào như sau: #import "YourProjectName-Swift.h"


Lưu ý: Bất cứ khi nào bạn muốn sử dụng tệp Swift của mình, bạn phải nhập dòng sau:

#import "YourProjectName-Swift.h"


1
Thay đổi giá trị của Defines moduletrong Build settingsđể Yeslà những gì cố định thứ cho tôi!
Zakaria Braksa

Nội dung nhúng chứa Swift: CÓ SỬ DỤNG cái này nữa
Mohit

4
câu trả lời tốt nhưng các bước 7-8 không cần thiết trong Xcode 7.3.1 trở lên
Sam B

Đã làm cho tôi! Cảm ơn.
itdamslife 7/12/2016

1
Chỉ muốn nói thêm rằng YourProjectNametrong #import "YourProjectName-Swift.h"sẽ là tên của dự án từ bước 8. hữu ích nếu tên dự án của bạn chứa các ký tự đặc biệt và bạn không chắc chắn như thế nào chính xác bạn nên định dạng nó.
Chuck Boris

40

Nếu bạn đang sử dụng Cocoapods và cố gắng sử dụng nhóm Swift trong dự án ObjC, bạn có thể chỉ cần làm như sau:

@import <FrameworkName>;

nhập mô tả hình ảnh ở đây


1
Cảm ơn rất nhiều! bạn đã cứu ngày của tôi
Esha

Điều này hoạt động như một cơ duyên nếu chúng ta cài đặt thư viện được tạo ra nhanh chóng thông qua Cocoapods. Nâng cao !!!
NSPratik

21

Đi đến xây dựng cài đặt trong tệp dự án của bạn và tìm kiếm "Tên tiêu đề giao diện được tạo mục tiêu-C . Giá trị của thuộc tính đó là tên mà bạn nên bao gồm.

Nếu thuộc tính "Tên mô-đun sản phẩm" của bạn (thuộc tính mà thuộc tính trên phụ thuộc theo mặc định) thay đổi tùy thuộc vào việc bạn biên dịch để kiểm tra / gỡ lỗi / phát hành / etc (như trong trường hợp của tôi), thì hãy làm cho thuộc tính này độc lập với điều đó biến thể bằng cách đặt tên tùy chỉnh.


15

Nhập Swifttệp bên trong Objective-ccó thể gây ra lỗi này, nếu nó không importđúng.

LƯU Ý: Bạn không phải nhập các tệp Swift ra bên ngoài, bạn chỉ cần nhập một tệp chăm sóc các tệp nhanh chóng.

Khi bạn đã tạo / Sao chép tệp Swift trong dự án Objective-C . Nó sẽ tự động tạo một tiêu đề bắc cầu.

Kiểm tra Objective-C Generated Interface Header Nametại Targets -> Build Settings.

nhập mô tả hình ảnh ở đây

Dựa vào trên, tôi sẽ nhập KJExpandable-Swift.hnhư nó là.

Của bạn sẽ là TargetName-Swift.h, Trường hợp TargetNamekhác nhau dựa trên tên dự án của bạn hoặc mục tiêu khác mà bạn có thể đã thêm và chạy trên đó.

Như dưới mục tiêu của tôi là KJExpandablevậy, nên nóKJExpandable-Swift.h
nhập mô tả hình ảnh ở đây


12

Bước đầu tiên:-

Chọn Mục tiêu dự án -> Cài đặt bản dựng -> Tìm kiếm ('Xác định') -> Xác định giá trị cập nhật Mô-đun Không thành

"Xác định mô-đun": .

"Luôn nhúng thư viện chuẩn Swift": .

"Cài đặt tiêu đề tương thích Objective-C": .

nhập mô tả hình ảnh ở đây

Bước thứ hai:-

Thêm lớp tệp Swift trong Mục tiêu C ".h" Tệp như bên dưới

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

Nhập 'ProjectName (Tên dự án của bạn) -Swift.h' trong tệp Mục tiêu C ".m"

//TestViewController.m 
#import "TestViewController.h"

/*import ProjectName-Swift.h file to access Swift file here*/

#import "ProjectName-Swift.h"

Khai báo chuyển tiếp (@ class) của lớp là một điểm rất tốt! Cảm ơn!
Philipp Otto

10

Có một cảnh báo nếu bạn đang nhập mã Swift vào các tệp Objective-C trong cùng một khung. Bạn phải làm điều đó với việc chỉ định tên khung và dấu ngoặc góc:

#import <MyFramework/MyFramework-Swift.h>

MyFrameworkđây là cài đặt xây dựng "Tên mô-đun sản phẩm" ( PRODUCT_NAME = MyFramework).

Đơn giản chỉ cần thêm #import "MyFramework-Swift.h"sẽ không làm việc. Nếu bạn kiểm tra thư mục sản phẩm được xây dựng (trước khi #importthêm một thư mục như vậy , thì bạn đã có ít nhất một bản dựng thành công với một số mã Swift trong mục tiêu), thì bạn vẫn sẽ thấy tệp MyFramework-Swift.htrong Headersthư mục.


8

Nếu bạn có một dự án được tạo trong Swift 4 và sau đó thêm các tệp Objective-C, hãy làm như thế này:

@objcMembers
public class MyModel: NSObject {
    var someFlag = false         
    func doSomething() {         
        print("doing something")
    }
}

Tham khảo: https://useyourloaf.com/blog/objc-warnings-upgrad-to-swift-4/


Trong mã của tôi, sau khi tôi cập nhật nó lên Swift 4.2 từ swift 3. Nó không hoạt động
SNarula

lỗi gì bạn nhận được? Tôi đã sử dụng mã trên trong Swift4.2 và nó hoạt động tốt.
Prashant Bhayani

Được, nó tuyệt đấy.
Prashant Bhayani

4

Kiểm tra các ghi chú trước khi phát hành về Swift và Objective C trong cùng một dự án

https://developer.apple.com/l Library / prelelease / ios / document / Swift / Conception

Bạn nên nhập

#import "SCLAlertView-Swift.h"

3
Đã hiển thị cho tôi lỗi này: không tìm thấy tệp 'SCLAlertView-Swift.h'.
Viktor Radigan

2
Cần phải là tên dự án, không phải tên tệp - xem câu trả lời của tôi.
Bill

1
Cảm ơn các liên kết tài liệu. Đó là hữu ích để tham khảo.
louielouie

2
Để trích dẫn từ liên kết được cung cấp: The name of this header is your product module name followed by adding "-Swift.h".Vì vậy, đó không phải là tên lớp như bạn đã viết, mà là tên của mô-đun sản phẩm của bạn và đảm nhiệm việc nhập tất cả các tệp nhanh chóng, không chỉ là một tên cụ thể
Chris

4

Tìm kiếm "Tên tiêu đề giao diện được tạo mục tiêu-C" trong Cài đặt bản dựng của mục tiêu bạn đang cố gắng xây dựng (giả sử nó MyApp-Swift.h) và nhập giá trị của cài đặt này ( #import "MyApp-Swift.h") trong tệp nguồn nơi bạn đang cố truy cập API Swift của bạn.

Giá trị mặc định cho trường này là $(SWIFT_MODULE_NAME)-Swift.h. Bạn có thể thấy nó nếu bạn bấm đúp vào trường giá trị của cài đặt "Tên tiêu đề giao diện được tạo mục tiêu-C".

Ngoài ra, nếu bạn có dấu gạch ngang trong tên mô-đun của mình (giả sử là nó My-App), thì trong $(SWIFT_MODULE_NAME)tất cả các dấu gạch ngang sẽ được thay thế bằng dấu gạch dưới. Vì vậy, sau đó bạn sẽ phải thêm #import "My_App-Swift.h".


Tốt hơn so với phê duyệt. Dấu gạch ngang lãng phí 20 phút Tôi sẽ không bao giờ lấy lại được haha.
Roi Mulia

3

Nếu bạn muốn sử dụng tệp Swift vào lớp Objective-C , vì vậy từ Xcode 8 trở đi, bạn có thể làm theo các bước dưới đây:

Nếu bạn đã tạo dự án trong Objective-C:

  1. Tạo tệp Swift mới
  2. Xcode sẽ tự động nhắc về tệp Bridge-Header
  3. Tạo ra nó
  4. Nhập "ProjectName-Swift.h" trong bộ điều khiển Objective-C của bạn (nhập trong triển khai không có trong giao diện) (nếu dự án của bạn có khoảng trắng ở giữa tên, vì vậy hãy sử dụng dấu gạch dưới "Project_Name-Swift.h")
  5. Bạn sẽ có thể truy cập lớp Objective-C của mình trong Swift.

Biên dịch nó và nếu nó sẽ tạo ra lỗi liên kết như: được biên dịch với phiên bản mới hơn của ngôn ngữ Swift (3.0) so với các tệp trước đó (2.0) cho kiến ​​trúc x86_64 hoặc armv 7

Tạo thêm một thay đổi trong bạn

  1. Xcode -> Dự án -> Mục tiêu -> Cài đặt bản dựng -> Sử dụng Phiên bản ngôn ngữ Swift kế thừa -> Có

Xây dựng và chạy.


1
Tôi không nhận được tùy chọn này để sử dụng phiên bản ngôn ngữ nhanh chóng kế thừa
lần thứ

1

Hãy cẩn thận với dấu gạch ngang và dấu gạch dưới, chúng có thể được trộn lẫn và Tên dự án và tên mục tiêu của bạn sẽ không giống với SWIFT_MODULE_NAME.

Dấu gạch ngang và dấu gạch dưới


1
#import <TargetName-Swift.h>

bạn sẽ thấy khi bạn nhập từ bàn phím #import <và sau khi tự động Xcode sẽ tư vấn cho bạn.


-1

Tìm tệp .PCH bên trong dự án. và sau đó thêm #import "YourProjectName-Swift.h"Điều này sẽ nhập các tiêu đề lớp. Vì vậy, bạn không phải nhập vào tập tin cụ thể.

#ifndef __IPHONE_3_0
#warning "This project uses features only available in iPhone SDK 3.0 and later."
#endif


#ifdef __OBJC__
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    #import "YourProjectName-Swift.h"
#endif
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.