Không tìm thấy tệp Project-Swift.h vào tệp Objective-C class


128

Tôi có một dự án đã được bắt đầu trong Objective-C và tôi đang cố gắng nhập một số mã Swift vào cùng các tệp lớp mà tôi đã viết Objective-C trước đó.

Tôi đã tham khảo tài liệu của Apple về việc sử dụng Swift và Objective-C trong cùng một dự án, cũng như câu hỏi SO như thế này, nhưng vẫn không có kết quả: Tôi tiếp tục nhận được tệp không tìm thấy lỗi sau khi đặt #import "NewTestApp-Swift.h"( NewTestApplà tên của Sản phẩm và mô-đun).

Đây là những gì tôi đã làm cho đến nay:

  1. Trong Define Modules, được chọn YEScho ứng dụng.
  2. Đảm bảo rằng tên Mô-đun sản phẩm không có bất kỳ khoảng trống nào trong đó (xem ảnh chụp màn hình bên dưới câu hỏi)

Tôi đã cố gắng sử dụng #import "NewTestApp-Swift.h"bên trong ViewController.m, ViewController.hAppDelegate.mnhưng ai trong số họ đã làm việc.

Những gì tôi đang làm không chính xác? Cảm ơn bạn đã giúp đỡ.


Ảnh chụp màn hình của cài đặt:

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


Lỗi mà tôi hiện đang gặp phải:

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


3
Xóa tất cả các dữ liệu ~/Library/Developer/Xcode/DerivedDataphái sinh trong đã làm cho tôi lừa.
wzhang84

Đây là cách tôi giải quyết vấn đề: stackoverflow.com/a/45338549/8102549
schrulnz 26/07/17

Câu trả lời:


158

Tôi đã gặp vấn đề tương tự và không thể khiến dự án của mình nhập nhanh vào các lớp obj-c. Sử dụng Xcode 6, (nên hoạt động cho Xcode 6+) và có thể thực hiện theo cách này ....

  1. Bất kỳ lớp nào bạn cần truy cập trong tệp .h cần phải là một khai báo chuyển tiếp như thế này

@class MySwiftClass;

  1. Trong tệp .m CHỈ, nếu mã nằm trong cùng một dự án (mô-đun) thì bạn cần nhập nó với

#import "ProductModuleName-Swift.h"

Liên kết đến tài liệu táo về nó

https://developer.apple.com/documentation/swift/imported_c_and_objective-c_apis/importing_swift_into_objective-c


3
Cảm ơn câu trả lời. Điều đó dẫn tôi đi đúng hướng. Tôi gặp vấn đề tương tự nhưng với một giao thức nên tôi phải thêm @protatio MySwiftProtocol thay vì nhập trong tệp tiêu đề của tôi.
palme

trong tệp .h chuyển tiếp khai báo của lớp mà không áp dụng tệp .h đã lừa tôi. Cảm ơn
Sikander

1
Lưu ý rằng nếu tên sản phẩm của bạn có -ký tự trong đó, tên của tệp tiêu đề được tạo sẽ được chuyển đổi thành _. ví dụ: nếu tên sản phẩm của bạn là My-App, bạn sẽ nhập My_App-Swift.h.
dvanoni

1
Tôi đã tìm thấy một cách mới để tìm tên tệp tiêu đề được tạo chính xác: đi đến mục tiêu của bạn -> Cài đặt bản dựng -> Tìm kiếm từ khóaObjective-C Generated Interface Header Name , lô tô!
Itachi

2
Tôi đã làm cả hai điều này, và vẫn đang thấy vấn đề tương tự. Bạn có nghĩ rằng nó phải làm với thứ tự?
ArielSD

83

Nếu mã Swift nằm trong Mô-đun (như trong trường hợp của bạn):

#import <ProductName/ProductModuleName-Swift.h>

Nếu mã Swift nằm trong dự án (hỗn hợp Swift và ObjC):

#import <ProductModuleName-Swift.h>

Trong trường hợp của bạn, bạn phải thêm dòng này vào tệp * .m:

#import <NewTestApp/NewTestApp-Swift.h>

QUAN TRỌNG: nhìn vào "<" trong câu lệnh nhập

https://developer.apple.com


Cảm ơn bạn đã trả lời @ ikocel1. Thật không may, chúng không hoạt động. Tôi đã thử các biến thể của <NewTestApp-Swift/NewTestApp-Swift.h>, <NewTestApp/NewTestApp-Swift.h><NewTestApp/ViewController-Swift.h>tất cả các bên ViewController.m, nhưng vẫn tiếp tục nhận được "tập tin không tìm thấy" lỗi, mặc dù Cleaningdự án mỗi lần sau khi cố gắng kết hợp. Tôi đã bao gồm một ảnh chụp màn hình trong phần thân của câu hỏi trong trường hợp nó giúp.
nghệ sĩ daspian

Tôi chưa nhập bất kỳ mã Swift nào ViewController.m. Tôi đã chỉ cố gắng nhập các tiêu đề đầu tiên để cố gắng làm cho nó chấp nhận mã Swift. Tôi sẽ trộn và kết hợp cả mã Objective-C và Swift ViewController.m.
daspianist

1
Tôi không biết có thể trộn trực tiếp mã objc và mã swift trong cùng một tệp không.
ikocel1

1
Cảm ơn, tôi đoán đây là giả định mà tôi đã dựa trên tài liệu "Mix and Match" của Apple .. nhưng tôi đoán không có trong tập tin thực tế. Cảm ơn bạn!
daspianist

6
Tôi không hiểu tại sao câu trả lời này được chấp thuận. Vâng, nó là chính xác theo các tài liệu nhưng thực tế không làm việc cho tôi quá. Ngay cả trong câu hỏi, rõ ràng là người dùng sử dụng cú pháp vì nó được khuyến nghị cho câu trả lời này nhưng vẫn bị lỗi.
Darius Miliauskas 11/03/2015

54

Cách tôi quản lý để nhập nhanh chóng vào mục tiêu-c:

  • Xác định Mô-đun được đặt thành CÓ (trên dự án - không phải trên mục tiêu)
  • Tên mô-đun sản phẩm được đặt (trên mục tiêu - không phải trên dự án)
  • Trong ViewControll.m của bạn, nhập mã swift với:

    #import "MyProductModuleName-Swift.h"
  • Thêm một tệp nhanh chóng vào dự án object-c của bạn (File -> New -> Swift) và Xcode sẽ tạo tiêu đề bắc cầu từ object-c sang Swift nhưng điều này rất quan trọng để làm cho nó hoạt động theo cách khác - rõ ràng.

Đối với phần cuối cùng trong câu đố này là nhờ Swiftoverload vì đã cho tôi biết về việc thực sự thêm tệp Swift qua GUI Xcode và không chỉ kéo và thả các tệp swift hiện có vào dự án của tôi để làm cho nó hoạt động: http://nikolakirev.com/blog / bằng cách sử dụng swift-in-object-c-project


Ghi chú tuyệt vời. Tôi sẽ thêm rằng mục tiêu thử nghiệm là mô-đun riêng của nó và sẽ có tiêu đề riêng có tên "<#TestTargetName #> - Swift.h" và mọi khoảng trắng trong tên đích sẽ được chuyển đổi thành khoảng trắng.
Chuck Krutsinger

@ holm51 xin lỗi để hỏi điều này, nhưng ở đâu Define ModuleProduct Module Name?
matchifang

dấu gạch ngang -trong tên sẽ được chuyển đổi sang dấu gạch _cũng
CyberMew

11

Sử dụng Xcode 8.2.1 và nếu bạn xem Project > Build Settings> Objective-C Header Interface Header Name , ở đó nó chỉ hiển thị một tệp tiêu đề có tên như Product -Swift.h

Điều này có nghĩa là thay vì nhập riêng từng mô-đun từ tệp Objective-C .m, sử dụng tệp -Swift.h riêng lẻ, bạn chỉ cần nhập một Sản phẩm -Swift.h tổng hợp tất cả các mô-đun Swift.

Tôi gặp phải vấn đề tương tự bằng cách tìm cách nhập mô-đun truyền thống riêng biệt, nhưng phiên bản Xcode và Swift 3 hiện tại đã thay đổi nó để chỉ sử dụng một tiêu đề cho tất cả nhập mô-đun.


chào peter, bạn có thể tìm thấy tập tin này ở đâu? Hoặc nó được tự động tạo bởi xcode? Ngoài ra, bạn có phải thiết lập podfile khác vì thay đổi này không?
Rob Norback

@RobNorback Nếu tôi không sai, bạn chỉ có thể viết 'nhập "Product-Swift.h" trong tệp thực hiện / tiêu đề Obj-C để xem hiệu ứng mà không cần làm gì thêm. Đảm bảo rằng các cài đặt dự án của bạn có mọi cấu hình được kích hoạt để trộn Swift và Obj-C. Ngoài ra, tôi vẫn chưa gặp sự cố với Podfile. Xin vui lòng cho tôi biết nếu tôi thấy mọi thứ khác nhau.
petershine

Cảm ơn bạn, tôi đã dành hàng giờ cố gắng để gỡ lỗi này và vấn đề thực sự là mỗi mô-đun trong dự án của tôi đang tạo -Swift.htệp tiêu đề của riêng họ . Buộc tất cả chúng (tôi có 5 mục tiêu) sử dụng tệp tiêu đề chung đã khắc phục sự cố cho tôi.
Apoorv Khatreja

@ApoorvKhatreja làm thế nào bạn buộc họ làm điều đó? Đã viết tên tập tin rõ ràng?
Amit Raz

8

Dành một giờ cho vấn đề này, làm theo các bước sau sẽ giúp bạn hiểu những gì còn thiếu:

  1. Mở tùy chọn Xcode và điều hướng đến thư mục DeruredData
  2. Tìm kiếm "swift.h" trong công cụ tìm
  3. Nếu bạn không thể tìm thấy bất kỳ tệp dự án-swift.h, tệp này đã không được tạo. Bạn thường cần thêm @objc vào một trong các lớp nhanh chóng của mình và xây dựng thành công ứng dụng, chỉ sau đó Xcode mới tạo tệp này
  4. Nếu bạn tìm thấy tệp "xxx-swift.h", hãy đảm bảo câu lệnh nhập của bạn chứa tên chính xác.

làm thế nào để xác định vị trí-swift-tập tin


Vui lòng không thêm cùng một câu trả lời cho nhiều câu hỏi . Trả lời câu hỏi hay nhất và đánh dấu phần còn lại là trùng lặp, một khi bạn kiếm đủ danh tiếng. Nếu nó không phải là một bản sao, điều chỉnh bài đăng cho câu hỏi và gắn cờ để xóa.
Bhargav Rao

Cảm ơn vì điều này! Tôi đã thay đổi tên bằng tốt nghiệp của ứng dụng (không phải mục tiêu) và tiêu đề Swift cũng đổi tên. Đây là cách duy nhất tôi có thể tìm thấy những gì đang diễn ra.
Lucas P.

Cảm ơn đã gửi câu trả lời. Ảnh chụp màn hình và hình thức điểm chính xác ngay lập tức khiến tôi cuộn lại + nhìn + kết thúc tìm kiếm của tôi ... vấn đề đã được giải quyết!
dklt

6

Tôi gặp vấn đề khi nhập Swift vào dự án Objective-C. Cuối cùng, tôi đã xem xét thư mục Derivied Data để kiểm tra Xcode 7 đang tạo ra cái gì. Tên tệp hoàn toàn khác với tên tôi đang mong đợi.

Khi tôi đã có tên tệp thực tế, tôi đã nhập nó và dự án có thể xây dựng.


2
Tập tin này nằm ở đâu? Tôi nhìn quanh đó và không thể tìm thấy gì
Amit Raz

5

-Swift.hsẽ được tạo bởi Xcode tự động nếu mã Swift hiển thị API thông qua @objchoặc @objcMembers[Giới thiệu]

Thông thường một vị trí trông giống như

~/Library/Developer/Xcode/DerivedData/
  ProductModuleName-foo/
    Build/
      Intermediates.noindex/
        ProductModuleName.build/
          Debug-iphoneos/
            ProductModuleName.build/
              DerivedSources/
                ProductModuleName-Swift.h

Nó có thể được thay đổi bởi

Project editor -> select a target -> Build Settings -> Per-configuration Intermediate Build Files Path

Theo mặc định, giá trị là $(PROJECT_TEMP_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)


2

CÁC PHƯƠNG THỨC XÁC ĐỊNH: CÓ và nhập "ProjectName-Swift.h" trong tệp .m của lớp Obj-C

Điều này làm việc cho tôi để truy cập các lớp Swift trong Obj-c.


3
Nhưng làm thế nào để nhập nó vào tập tin .h nếu tôi cần lớp swift trong tiêu đề objc?
Alexander Danilov

1

Đã đối mặt với cùng một vấn đề với nhóm của tôi khi đang thực hiện dự án bằng git. Một nhà phát triển đã không cập nhật Xcode lên phiên bản mới nhất (7.3), phiên bản Swift 2.2 mới nhất. Vì vậy, trình biên dịch đã không nhận ra cú pháp Swift mới và không thể tạo giao diện cho thư viện Swift (projectname-swift.h). Kiểm tra xem phiên bản Xcode có phải là phiên bản mới nhất không!


Tôi là trường hợp của tôi, tôi đã phải đối mặt với vấn đề này vì đã quyết định hoãn việc di chuyển sang Swift 3 do Xcode cung cấp. Kết quả là Xcode không thể xây dựng các tệp nguồn Swift và không tạo các tiêu đề để đưa vào.
iutinvg

1

Trong quá trình phát triển, có thể có khả năng bạn sẽ có bất kỳ lớp nhanh chóng nào không được triển khai hoàn toàn do có thể có một số lỗi cú pháp. Tệp tiêu đề swift sẽ chỉ có sẵn để sử dụng nếu tất cả các tệp swift không có lỗi.

Đảm bảo không có lỗi cú pháp trong các tệp swift và sau đó thử nhập tiêu đề swift trong tệp mục tiêu - c


1

Nhập tệp tiêu đề, nghĩa là

#import "<ProjectName>-Swift.h" 

trong tệp .h tạo ra lỗi, cho biết:

Không tìm thấy tệp -Swift.h '

và việc xây dựng thất bại.

Thay vào đó sử dụng:

#import "<ProjectName>-Swift.h"

trong tệp .m và mặc dù cùng một lỗi xuất hiện, dù sao thì việc chạy dự án sẽ loại bỏ lỗi.

Các lớp swift sau đó có sẵn trong tệp .m.


1

Tôi phải đối mặt với vấn đề với tên của dự án (mục tiêu). Nó bao gồm ký hiệu "-". Vì vậy, quyết định là tiếp theo: nếu tên của dự án là "Ứng dụng thử nghiệm", thì tên của lớp được nhập là "Test_App-Swift.h"


giải pháp tuyệt vời
iOS Lifee

1

Nếu tên Ứng dụng của bạn có bất kỳ ký tự đặc biệt nào thì hãy sử dụng _ cho ký tự đặc biệt.

Ví dụ: nếu tên ứng dụng của bạn là Tên "Test App®"

Sau đó, bạn có thể nhập tệp swift bằng "Test_App_-Swift.h".

Space và ® được thay thế bằng _ trong khi bạn đang nhập.


0

Nếu bạn có nhiều mục tiêu, hãy đảm bảo rằng bạn đã xây dựng tất cả các khung


0

Xcode 11

Tôi gặp phải vấn đề này khi xây dựng trên Xcode 11. Tôi đã tìm hiểu một chút về những gì sai, nhưng về cơ bản, tôi đã thay đổi cài đặt "Tên hiển thị" trên tab "Chung" của Target thay vì thay đổi trực tiếp trong Info.plist tệp thông qua Tab "Thông tin" trên Target.

Điều này dẫn đến Xcode 11,5 trải qua việc viết lại / tạo ra một loạt các cài đặt xây dựng tùy chỉnh hoàn toàn mới và sửa đổi tên của mô-đun ứng dụng và sản phẩm .app được xây dựng. Trong trường hợp này, tên hiển thị mới cũng có /ký tự gạch chéo ( ) trong đó cuối cùng có thể là lý do tại sao nó không được xây dựng (xem câu trả lời của @Silversky Technology ).

Bất kể, tôi đã giải quyết vấn đề này bằng cách hoàn tác tất cả các thay đổi tự động của Xcode 11.5 đối với tệp dự án và thực hiện thay đổi tương tự với tên hiển thị gói trong Info.plist tệp và mọi thứ đều hoạt động hoàn hảo.

Tôi ước nó sẽ nói với bạn rằng nó đã làm những thứ như thế này trước khi nó xuất hiện và làm điều đó mà không có sự đồng ý của bạn.


0

Đảm bảo lớp nhanh chóng của bạn có khai báo công khai và mở rộng NSObject:

public class MySwiftClass: NSObject {
    //...
}

Việc nhập phải hoạt động với dấu ngoặc kép, không phải dấu ngoặc, nếu lớp swift nằm trong cùng một dự án.

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.