Xcode MyProjectName-Bridging-Header.h ไม่มีอยู่


118

ฉันต้องการเริ่มใช้ Swift ในโปรเจ็กต์ Objective-C ของฉัน ดังนั้นฉันจึงเพิ่มคลาสที่รวดเร็ว:

import Foundation
@objc class System : NSObject {
    @objc func printSome() {
        println("Print line System");
    }
}

และนำเข้าเป็นไฟล์. m:

#import "MyProjectName-Swift.h"

เมื่อสร้างโครงการของฉันฉันได้รับข้อผิดพลาดต่อไปนี้:

Bridging header 'PathToMyProject/MyProjectName-Bridging-Header.h' does not exist

หมายเหตุ: ภายใต้ "Build Settings-> Swift Compiler - Code Generation-> Objective-C Briding Header" ถูกตั้งค่าเป็น MyProjectName-Bridging-Header.h

ฉันควรทำอย่างไรเพื่อแก้ไขปัญหานี้

ความช่วยเหลือใด ๆ ที่ชื่นชมมาก

แก้ไข: ไฟล์ Bridging-Header: #if กำหนด (__ has_include) && __has_include () # รวม #endif

#include <objc/NSObject.h>
#include <stdint.h>
#include <stddef.h>
#include <stdbool.h>

#if defined(__has_include) && __has_include(<uchar.h>)
# include <uchar.h>
#elif __cplusplus < 201103L
typedef uint_least16_t char16_t;
typedef uint_least32_t char32_t;
#endif
#if !defined(SWIFT_PASTE)
# define SWIFT_PASTE_HELPER(x, y) x##y
# define SWIFT_PASTE(x, y) SWIFT_PASTE_HELPER(x, y)
#endif
#if !defined(SWIFT_METATYPE)
# define SWIFT_METATYPE(X) Class
#endif

#if defined(__has_attribute) && __has_attribute(objc_runtime_name)
# define SWIFT_RUNTIME_NAME(X) __attribute__((objc_runtime_name(X)))
#else
# define SWIFT_RUNTIME_NAME(X)
#endif
#if !defined(SWIFT_CLASS_EXTRA)
# define SWIFT_CLASS_EXTRA
#endif
#if !defined(SWIFT_PROTOCOL_EXTRA)
# define SWIFT_PROTOCOL_EXTRA
#endif
#if !defined(SWIFT_CLASS)
# if defined(__has_attribute) && __has_attribute(objc_subclassing_restricted) 
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) __attribute__((objc_subclassing_restricted)) SWIFT_CLASS_EXTRA
# else
#  define SWIFT_CLASS(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_CLASS_EXTRA
# endif
#endif

#if !defined(SWIFT_PROTOCOL)
# define SWIFT_PROTOCOL(SWIFT_NAME) SWIFT_RUNTIME_NAME(SWIFT_NAME) SWIFT_PROTOCOL_EXTRA
#endif

#if !defined(SWIFT_EXTENSION)
# define SWIFT_EXTENSION(M) SWIFT_PASTE(M##_Swift_, __LINE__)
#endif

#if !defined(OBJC_DESIGNATED_INITIALIZER)
# if defined(__has_attribute) && __has_attribute(objc_designated_initializer)
#  define OBJC_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
# else
#  define OBJC_DESIGNATED_INITIALIZER
# endif
#endif
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"

#if defined(__has_feature) && __has_feature(modules)
#endif

#pragma clang diagnostic pop

2
MyProjectName-Swift.hและMyProjectName-Bridging-Header.hทำงานในทิศทางตรงกันข้าม MyProjectName-Swift.hให้โดยอัตโนมัติ MyProjectName-Bridging-Header.hอย่างไรก็ตามมีให้แบบกึ่งอัตโนมัติกล่าวคือคุณต้องแน่ใจว่ามีอยู่ คุณแน่ใจหรือว่าเห็นMyProjectName-Bridging-Header.hในตัวนำทางโครงการของคุณ? ถ้าไม่มีให้สร้างและเพิ่มไฟล์ที่มีชื่อนั้นในโปรเจ็กต์ของคุณ จากนั้นตรวจสอบอีกครั้งว่าเส้นทางในการตั้งค่าการสร้างนั้นถูกต้อง (ควรมีไดเร็กทอรีโปรเจ็กต์ของคุณ: MyProjectName/MyProjectName-Bridging-Header.h.
milos

คุณได้ตรวจสอบชื่อโมดูลผลิตภัณฑ์ของคุณแล้วหรือยัง (สร้างการตั้งค่า -> บรรจุภัณฑ์ -> ชื่อโมดูลผลิตภัณฑ์)
Nina

นีน่าใช่ชื่อโมดูลของฉันคือ "MyProjectName" ไม่ใช่
วงรี

milos ฉันคิดว่า Xcode ควรจะสร้างไฟล์เชื่อมโยงนี้โดยอัตโนมัติ ไม่ฉันไม่มีไฟล์นั้นในโครงการของฉัน
user2408952

1
คุณได้ระบุ Bridging-Header.h ด้วยตนเองหรือไม่? ฉันเห็นว่ามีการสะกดผิด 'Briding'
Nina

คำตอบ:


191

หากไฟล์ bridging ถูกสร้างขึ้นในระดับเดียวกับคลาสอื่น ๆ คุณอาจต้องเพิ่มพา ธ สัมพัทธ์ตามที่แสดงในรูปภาพ โปรดทราบว่าไฟล์ bridging ถูกสร้างขึ้นในระดับเดียวกับคลาสอื่น ๆ : ใส่คำอธิบายภาพที่นี่

ฉันป้อนชื่ออย่างถูกต้องในการตั้งค่าการสร้าง ใส่คำอธิบายภาพที่นี่

แต่คอมไพเลอร์ไม่พบไฟล์ ใส่คำอธิบายภาพที่นี่

ดังนั้นถ้าฉันเพิ่มเส้นทางสัมพัทธ์จากรูทของโปรเจ็กต์ (นั่นคือฉันเพิ่ม./ProjectName/BridgerFileName.h) ใส่คำอธิบายภาพที่นี่

ตอนนี้มันรวบรวมและฉันสามารถเรียกเมธอดในคลาส Objective C ของฉัน: ใส่คำอธิบายภาพที่นี่


4
สำหรับฉันมันไม่ได้แก้ไขเลย ดูเหมือนว่า XCode จะไม่ตอบสนองต่อฟิลด์ Objective-C Bridging Header ที่ปรับปรุงแล้ว
Darius Miliauskas

ใช้เวลานานสำหรับฉันที่จะพบ แต่ในที่สุด ขอบคุณแก้ไขข้อผิดพลาด :)
Anders Sørensen

แสดงให้เห็นแล้ว! และใช่อย่าลืมทำสิ่งนี้ทั้งใน Project Build Settings และใน Target Build settings
Akash Bhardwaj

72

ฉันพบว่าหลังจากสร้างไฟล์ส่วนหัวการเชื่อมต่อด้วยตนเองและเลือกชื่อและตำแหน่งเริ่มต้นแล้วส่วนหัวของการเชื่อมต่อจะถูกวางไว้ในไดเร็กทอรีโปรเจ็กต์ซึ่งอยู่ภายใต้ไดเร็กทอรีราก

สิ่งนี้ต้องการค่าต่อไปนี้สำหรับการตั้งค่า: Targets> [Your App Target]> Build Settings> Swift Compiler - Code Generation> Objective-C Bridging Header :

$(SRCROOT)/$(PROJECT_NAME)/$(PROJECT_NAME)-Bridging-Header.h 

โปรดทราบว่าหากโครงการของคุณเป็นโมดูลที่รวดเร็ว (เฟรมเวิร์ก) ตามที่ระบุไว้ในความคิดเห็นคุณอาจต้องการ:

$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.h

2
$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.hจะเป็นเรื่องธรรมดามากขึ้น :)
gaussblurinc

1
นี่ควรเป็นคำตอบเดียว!
Luca Davanzo

$(SRCROOT)/$(PROJECT_NAME)/$(SWIFT_MODULE_NAME)-Bridging-Header.hถึงโฟลเดอร์โครงการของฉันฉันได้รับเส้นทางที่ถูกต้อง แต่ต่อท้าย/$(PROJECT_NAME)ไม่พาฉันไปยังเส้นทางที่ต้องการ
iPeter

หมายเหตุสำหรับคนอื่น ๆ ที่อาจมีปัญหาเดียวกัน - เมื่อฉันคัดลอก / วางความคิดเห็น @gaussblurinc มีอักขระแปลก ๆ บางตัวคัดลอกในส่วน "ส่วนหัว" ของสตริง หลังจากคัดลอก / วางสตริงเดียวกันจากคำตอบแล้วก็ใช้งานได้ดี
Adam Johns

46

สำหรับผู้ที่กำลังลบ Bridging Header

ฉันกำลังไปในทางตรงกันข้ามกับคำตอบอื่น ๆ ส่วนใหญ่ที่นี่ ฉันเคยใช้ Bridging Header มาก่อน แต่ฉันไม่ต้องการมันอีกต่อไป หลังจากที่ฉันลบออกจากโครงการฉันเริ่มได้รับข้อผิดพลาดที่กล่าวถึงในคำถาม ฉันทำตามขั้นตอนต่อไปนี้เพื่อแก้ปัญหาของฉัน

  1. ไปที่Targets> [Your App Target]> Build Settings> Swift Compiler - General> Objective-C Bridging Headerและลบเส้นทาง (ขอบคุณ @Donamiteสำหรับแนวคิดนี้) (คุณสามารถเริ่มพิมพ์ "bridging" ในช่องค้นหาเพื่อค้นหาได้)
  2. ลบวันที่ได้รับ ไปที่Xcode> Preferences> Locationsแล้วคลิกลูกศรสีเทาข้างโฟลเดอร์ Derived Data จากนั้นลบโฟลเดอร์โครงการของคุณ

ใส่คำอธิบายภาพที่นี่


22

ในSwift 4.1

โครงการของคุณคุณไม่มี bridging-Header.hไฟล์ แต่โครงการของคุณมีเส้นทางนั้น สำหรับสิ่งนี้คุณต้องลบเส้นทางนั้น ...

ไปที่targetsไฟล์แล้วเลือกBuild Settings----> Swift Compiler - Generalและลบไฟล์bridging-Header.h. ติดตามภาพหน้าจอด้านล่าง ....ใส่คำอธิบายภาพที่นี่

ลบbridging-Header.hไฟล์ใน Swift Compiler - General

ใส่คำอธิบายภาพที่นี่

ตอนนี้คุณเป็นแบบนี้ ...

ใส่คำอธิบายภาพที่นี่


14

ในการเพิ่มไฟล์ Bridge ในโครงการ Swift

ขั้นตอนที่ 1. ไปที่ไฟล์> เพิ่มโกโก้ด้วยไฟล์ Objective-C (สำหรับวัตถุประสงค์ชั่วคราว)

ใส่คำอธิบายภาพที่นี่

ขั้นตอนที่ 2. จากนั้นป๊อปอัปต่อไปนี้จะปรากฏขึ้นใส่คำอธิบายภาพที่นี่

ตอนนี้กดปุ่ม Create Bridging Header

เสร็จแล้ว
คุณจะได้รับไฟล์ BRIGDE ในกลุ่ม
ขอบคุณ


13

นี่คือขั้นตอนในการสร้างส่วนหัวของการเชื่อมต่อ

  1. File-> New-> iOS-> Header Fileให้ตั้งชื่อไฟล์ bridging เป็น "yourProjectName-Bridging-Header.h"

  2. Build-Settings-> Objective-C Bridging Headerเพียงตั้งชื่อไฟล์ bridging header ให้เป็น "ProjectName-Bridging-Header.h"

    หมายเหตุ: การเชื่อมโยงไฟล์ส่วนหัวควรอยู่ในโฟลเดอร์รูทหลักของโปรเจ็กต์ที่มีไฟล์ ".xcodeproj" อยู่ ถ้าไม่ย้ายไฟล์ส่วนหัว Bridging ไปยังโฟลเดอร์รากของโปรเจ็กต์ วิธีนี้ Xcode สามารถเข้าถึงไฟล์บริดจ์

  3. สร้างโครงการและนำเข้าไฟล์ที่จำเป็นใน Bridging header


12

สำหรับฉันการใช้ $ (SRCROOT) / $ (PROJECT_NAME) / หน้าเส้นทางไฟล์ส่วนหัวที่เชื่อมต่อของฉันช่วยได้


1
นี่คือคำตอบที่ใช้ได้ ไม่ควรถูกทำเครื่องหมายลง คุณสามารถใช้ $ (SRCROOT) และ $ (PROJECT_NAME) เป็นแนวทางเพื่อให้ได้คำตอบที่ถูกต้อง แต่คุณอาจไม่สามารถคัดลอกและวางโซลูชันทั้งหมดได้
Hobbes the Tige

โซลูชันที่นำเสนอในคำตอบนี้ได้แก้ไขปัญหาของฉันแล้วขอบคุณ Srinivas Padidala
Wilson

ไปเลย $ (SRCROOT) / $ (PROJECT_NAME) /YourProjectName-Bridging-Header.h ใช้ได้กับฉัน ............ วาง $ (SRCROOT) / $ (PROJECT_NAME) / ตามที่เป็นอยู่ ..... อย่าเพิ่มชื่อโครงการของคุณแทน $ (PROJECT_NAME)
ioSana

6

สำหรับฉันมันช่วยได้ที่จะใช้$(SRCROOT)ในด้านหน้าของเส้นทางส่วนหัวของ Objective-C bridging ของฉัน

$(SRCROOT)/swiftLibraries/swiftLibraries-Bridging-Header.h

5

ทำตามขั้นตอนด้านล่าง:

  1. ลบไฟล์เชื่อมต่อส่วนหัว . . (บางทีคุณอาจสร้างด้วยตนเอง) และ;
  2. สร้างไฟล์ Swift ใหม่ในโครงการ Objective-C . . (ไม่ใช่นำเข้าสร้างก่อน)

บางทีสองสิ่งนี้อาจช่วยแก้ปัญหาของคุณได้


5

สิ่งต่อไปนี้ใช้ได้ผลสำหรับฉัน:

  1. ไฟล์ส่วนหัวการเชื่อมโยงควรอยู่ในโฟลเดอร์รูทหลักของโครงการที่มีไฟล์ ".xcodeproj" อยู่ ย้ายไปที่ไดเร็กทอรีโปรเจ็กต์แล้วลากและวางเชื่อมโยงส่วนหัวไปยังรูทหากอยู่ในโฟลเดอร์อื่น
  2. แก้ไขการสะกดผิดในชื่อส่วนหัว
  3. ล้างข้อมูลที่ได้มา
  4. Target -> Build Settings -> Swift Compiler: General -> Add Obj C Header name
  5. ทำความสะอาดและเรียกใช้อีกครั้ง

2

การสร้างไฟล์ Bridging Header ด้วยตนเอง

ก่อนอื่นให้ลบไฟล์ส่วนหัว Bridging ซึ่ง Xcode ถูกสร้างขึ้น และเลือกโปรเจ็กต์ของคุณไปที่> สร้างการตั้งค่า> ค้นหาคำสำคัญ Swift Compiler - การสร้างรหัส คลิกที่ Objective-C Bridging Header ลบเส้นทางนั้น ตอนนี้ทำความสะอาดโครงการของคุณ

ตอนนี้เลือกโครงการของคุณ> หน้าต่างในแถบนำทาง เลือกโครงการและลบข้อมูลที่ได้รับจากที่นั่น

ตอนนี้สร้างไฟล์ใหม่เลือกSourceจากนั้นเลือกHeader Fileและสร้างไฟล์ Bridging header ชื่อไฟล์ต้องเป็นชื่อโปรเจ็กต์ของคุณ-Bridging-Header.hจากนั้นสร้าง

เลือกโปรเจ็กต์ของคุณไปที่หน้า> การตั้งค่าการสร้าง> ค้นหาคำสำคัญ Swift Compiler - การสร้างรหัส คลิกที่ Objective-C Bridging Header และตอนนี้เพิ่มเส้นทางใน Objective-C Bridging Header นี้เช่นprojectname-Bridging-Header.h

ตอนนี้นำเข้าชั้นเรียนของคุณลงในไฟล์ส่วนหัวเชื่อมต่อและคุณสามารถรวบรวมรหัสของคุณได้อย่างง่ายดาย

ไฟล์ส่วนหัวเชื่อมต่อของคุณจะมีลักษณะเช่นนี้เมื่อคุณสร้างไฟล์ด้วยตนเอง


0

สิ่งที่ช่วยฉันคือการย้ายไฟล์ด้วยตนเองไปยังเส้นทางที่กล่าวถึงในข้อความแสดงข้อผิดพลาด ดังนั้น:

  1. ฉันลบไฟล์ (ย้ายไปที่ถังขยะ)
  2. ย้ายจากถังขยะไปยังเส้นทางในข้อความแสดงข้อผิดพลาด
  3. หลังจากนั้นฉันก็ต้องทำความสะอาดโครงการด้วย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.