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
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
Câu trả lời:
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 @objc
hoặ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 Project
trở 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
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 Có . 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.
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
Đây là những gì để làm:
Tạo một dự án mới trong Objective-C
Tạo một .swift
tập tin
mới
Nhấp vào tệp Dự án Xcode của bạn
Nhấp vào Cài đặt bản dựng
Tìm thanh Tìm kiếm và tìm kiếm Mô-đun Xác định .
Thay đổi giá trị thành Có .
Tìm kiếm Tên mô-đun sản phẩm .
Thay đổi giá trị thành tên của dự án của bạn.
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"
Defines module
trong Build settings
để Yes
là những gì cố định thứ cho tôi!
YourProjectName
trong #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ó.
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>;
Đ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.
Nhập Swift
tệp bên trong Objective-c
có 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 Name
tại Targets -> Build Settings
.
Dựa vào trên, tôi sẽ nhập KJExpandable-Swift.h
như nó là.
Của bạn sẽ là TargetName-Swift.h
, Trường hợp TargetName
khá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à KJExpandable
vậy, nên nóKJExpandable-Swift.h
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 Có
"Xác định mô-đun": CÓ .
"Luôn nhúng thư viện chuẩn Swift": CÓ .
"Cài đặt tiêu đề tương thích Objective-C": CÓ .
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"
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 #import
thê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.h
trong Headers
thư mục.
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/
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"
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ể
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"
.
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:
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
Xây dựng và chạy.
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.
#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.
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