ฉันจะนำเข้ารหัส Swift ไปยัง Objective-C ได้อย่างไร


281

ฉันเขียนห้องสมุดใน Swift และฉันไม่สามารถนำเข้าสู่โครงการปัจจุบันของฉันเขียนใน Objective-C

มีวิธีการนำเข้าหรือไม่

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

9
รักโครงการนี้!
SleepsOnNewspapers

คำตอบ:


430

TargetName-Swift.hคุณจำเป็นต้องนำเข้า โปรดทราบว่ามันคือชื่อเป้าหมาย - คำตอบอื่น ๆ สร้างความผิดพลาดในการใช้ชื่อคลาส

นี้ไฟล์เดียวเป็นส่วนหัวที่สร้างโดยอัตโนมัติว่าอินเตอร์เฟซที่กำหนดวัตถุประสงค์ -C สำหรับทุกชั้นเรียนสวิฟท์ในโครงการของคุณที่มีข้อเขียนทั้งที่มีหรือรับมรดกจาก@objcNSObject

การพิจารณา:

  • หากชื่อเป้าหมายของคุณมีช่องว่างให้แทนที่ด้วยช่องว่าง (เช่นMy Projectกลายเป็นMy_Project-Swift.h)

  • หากเป้าหมายของคุณเป็นกรอบคุณต้องนำเข้า <TargetName/TargetName-Swift.h>

  • ตรวจสอบให้แน่ใจว่าไฟล์ Swift ของคุณเป็นสมาชิกของเป้าหมาย


5
โปรดทราบว่าหากคุณพยายามใช้ชื่อไฟล์ Swift ในการนำเข้าของคุณคุณจะได้รับข้อผิดพลาด "Expected ';' หลังตัวประกาศระดับสูง " ในไฟล์ Swift ของคุณหลังจาก "นำเข้ารากฐาน"
louielouie

8
แก้ไข: หมายเหตุ:เพื่อให้ใช้งานได้จะต้องกำหนดชื่อโมดูลโครงการ ดู: stackoverflow.com/a/24064015/2085743
รูเบนมาร์ติเนจูเนียร์

7
ฉันต้องการเพิ่มบันทึกย่อว่าถ้าชื่อโครงการของคุณมีช่องว่างหรืออักขระพิเศษคุณต้องแทนที่ด้วยขีดล่างเช่น "My App" จะเป็น "My_App-Swift.h"
Hola Soy Edu Feliz Navidad

84
เหตุใดจึงเป็นเรื่องยากและบันทึกไม่ดี?
uchuugaka

3
@lelelo ไม่ไฟล์นั้นตรงข้ามกับไฟล์นี้ ส่วนหัวการเชื่อมต่อนั้นเขียนโดยนักพัฒนาและให้คุณนำสัญลักษณ์ Objective-C และ C มาไว้ในรหัส Swift ของคุณ ไฟล์ Target-Swift.h จะถูกสร้างขึ้นโดยอัตโนมัติและอนุญาตให้สัญลักษณ์สัญลักษณ์ Swift ของ Objective-C / C ของคุณเข้าถึงได้
Bill

154

คำแนะนำจากเว็บไซต์ Apple:

ในการนำเข้ารหัส Swift ไปยัง Objective-C จากเฟรมเวิร์กเดียวกัน

ภายใต้การตั้งค่ารูปร่างในบรรจุภัณฑ์ให้แน่ใจว่ากำหนดโมดูล การตั้งค่าเป้าหมายกรอบที่มีการตั้งค่าใช่ นำเข้ารหัส Swift จากเป้าหมายของกรอบงานนั้นไปยังไฟล์ Objective-C .m ภายในเป้าหมายของกรอบงานนั้นโดยใช้ไวยากรณ์นี้และแทนที่ชื่อที่เหมาะสม:

#import "ProductName-Swift.h"

Revision:

คุณสามารถนำเข้า"ProductName-Swift.h"ในไฟล์. m เท่านั้น

ไฟล์ Swift ในเป้าหมายของคุณจะปรากฏในไฟล์ Objective-C .m ที่มีคำสั่งนำเข้านี้

เพื่อหลีกเลี่ยงการอ้างอิงตามวัฏจักรอย่านำเข้า Swift ลงในไฟล์ส่วนหัว Objective-C แต่คุณสามารถส่งต่อประกาศคลาส Swift เพื่อใช้ในส่วนหัว Objective-C โปรดทราบว่าคุณไม่สามารถคลาสย่อย Swift ใน Objective-C

ป้อนคำอธิบายรูปภาพที่นี่


2
นำเข้าเฉพาะ "ProductName-Swift.h" ในไฟล์. m เท่านั้นที่ช่วยฉันได้ การเพิ่มไฟล์. pch ให้เหมือนกันคือ "ไม่สามารถหาการประกาศโปรโตคอลสำหรับ 'CLLocationManagerDelegate' คุณหมายถึง 'NSLayoutManagerDelegate' หรือไม่"
Alphonse R. Dsouza

@Ait มันไม่ได้โดยตรงเอกสารบอกว่า วิธีที่ง่ายที่สุดคือการสร้างคลาส Objective-C ที่แปลในรูปแบบที่ Objective-C ++ เข้าใจ developer.apple.com/library/ios/documentation/Swift/Conceptual/...
Alejandro Iván

1
โปรดทราบว่าคุณจะต้องได้รับจากNSObject!!! คุณไม่สามารถบอกได้class Blah อย่างรวดเร็วและทำงานได้ มันต้องเป็นclass Blah : NSObject
David T.

ควรอ่านคำตอบนี้สำหรับบางกรณี: stackoverflow.com/questions/26328034/… ขึ้นอยู่กับสิ่งที่คุณกำลังทำ: #import <ProductName / ProductModuleName-Swift.h> #import <ProductModuleName-Swift.h> #import <NewTestApp / NewTestApp -Swift.h>
inigo333

ถ้าคุณต้องการนำเข้าส่วนขยาย Swift ล่ะ
Ricardo

150

นี่คือสิ่งที่ต้องทำ:

  1. สร้างโครงการใหม่ใน Objective-C

  2. สร้าง.swiftไฟล์   ใหม่

    • หน้าต่างป๊อปอัพจะปรากฏขึ้นและถามว่า "คุณต้องการกำหนดค่าการเชื่อมต่อส่วนหัว Objective-C"หรือไม่
    • เลือกใช่
  3. คลิกที่ไฟล์ Xcode Projectของคุณ

  4. คลิกที่การตั้งค่าการสร้าง

  5. ค้นหาแถบค้นหาและค้นหากำหนดโมดูล

  6. การเปลี่ยนแปลงมูลค่าให้ใช่

  7. ค้นหาสินค้าชื่อโมดูล

  8. เปลี่ยนค่าเป็นชื่อโครงการของคุณ

  9. ในตัวแทนแอปเพิ่มสิ่งต่อไปนี้: #import "YourProjectName-Swift.h"


หมายเหตุ: เมื่อใดก็ตามที่คุณต้องการใช้ไฟล์ Swift คุณจะต้องนำเข้าบรรทัดต่อไปนี้:

#import "YourProjectName-Swift.h"


1
การเปลี่ยนค่าของDefines moduleในBuild settingsที่จะYesเป็นสิ่งที่คงที่สิ่งที่ฉัน!
Zakaria Braksa

เนื้อหาฝังตัวประกอบด้วย Swift: ใช่ใช้สิ่งนี้ด้วย
Mohit

4
คำตอบที่ดี แต่ไม่จำเป็นต้องใช้ขั้นตอนที่ 7-8 ใน Xcode 7.3.1 และสูงกว่า
Sam B

ทำงานให้ฉัน! ขอบคุณ
itsdamslife

1
เพียงแค่ต้องการเพิ่มเข้าไปYourProjectNameใน#import "YourProjectName-Swift.h"นั้นจะเป็นชื่อของโครงการจากขั้นตอนที่ 8 มีประโยชน์ถ้าชื่อโครงการของคุณมีอักขระพิเศษและคุณไม่แน่ใจว่าคุณควรจัดรูปแบบอย่างไร
Chuck Boris

40

หากคุณใช้ Cocoapods และพยายามใช้ Swift pod ในโครงการ ObjC คุณสามารถทำสิ่งต่อไปนี้ได้:

@import <FrameworkName>;

ป้อนคำอธิบายรูปภาพที่นี่


1
ขอบคุณมาก! คุณบันทึกวันของฉัน
Esha

สิ่งนี้ทำงานได้ดีหากเราติดตั้งไลบรารี่ที่ทำขึ้นอย่างรวดเร็วผ่าน Cocoapods โหวตแล้ว !!!
NSPratik

21

ไปที่การตั้งค่าในการสร้างไฟล์โครงการของคุณและค้นหา"Objective-C สร้างการเชื่อมต่อของชื่อส่วนหัว . มูลค่าของทรัพย์สินที่เป็นชื่อที่คุณควรจะรวมถึง

หากคุณสมบัติ "ชื่อโมดูลผลิตภัณฑ์" ของคุณ (ชื่อที่คุณสมบัติด้านบนขึ้นอยู่กับค่าเริ่มต้น) จะแตกต่างกันไปขึ้นอยู่กับว่าคุณได้ทำการคอมไพล์สำหรับการทดสอบ / debug / release / etc (เช่นเดียวกับที่ใช้ในกรณีของฉัน) รูปแบบโดยการตั้งชื่อที่กำหนดเอง


15

การนำเข้าSwiftไฟล์ด้านในObjective-cอาจทำให้เกิดข้อผิดพลาดนี้หากไม่importถูกต้อง

หมายเหตุ: คุณไม่จำเป็นต้องนำเข้าไฟล์ Swift จากภายนอกคุณเพียงแค่นำเข้าไฟล์เดียวซึ่งดูแลไฟล์ swift

เมื่อคุณสร้าง / ไฟล์คัดลอก Swiftภายในโครงการ Objective-C มันจะสร้างส่วนหัว bridging โดยอัตโนมัติ

ตรวจสอบที่ Objective-C Generated Interface Header NameTargets -> Build Settings

ป้อนคำอธิบายรูปภาพที่นี่

จากข้างต้นฉันจะนำเข้าKJExpandable-Swift.hเหมือนเดิม

สิ่งที่คุณจะทำTargetName-Swift.hคือTargetNameแตกต่างกันไปตามชื่อโครงการของคุณหรือเป้าหมายอื่นที่คุณอาจเพิ่มและดำเนินการอยู่

ต่ำกว่าเป้าหมายของฉันKJExpandableดังนั้นมันเป็นKJExpandable-Swift.h
ป้อนคำอธิบายรูปภาพที่นี่


12

ขั้นแรก:-

เลือกเป้าหมายโครงการ -> การตั้งค่าการสร้าง -> ค้นหา ('กำหนด') -> กำหนด ค่าการปรับปรุงโมดูลไม่ใช่เป็นใช่

"กำหนดโมดูล": YES

"เสมอฝังสวิฟท์ห้องสมุดมาตรฐาน": YES

"ติดตั้ง Objective-C ความเข้ากันได้ของส่วนหัว": YES

ป้อนคำอธิบายรูปภาพที่นี่

ขั้นตอนที่สอง: -

เพิ่มไฟล์ Swift Class ใน Objective C ".h" ไฟล์ดังต่อไปนี้

#import <UIKit/UIKit.h>

@class TestViewController(Swift File);

@interface TestViewController(Objective C File) : UIViewController

@end

นำเข้า 'ProjectName (ชื่อโครงการของคุณ) -Swift.h' ในไฟล์ Objective C ".m"

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

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

#import "ProjectName-Swift.h"

การประกาศไปข้างหน้า (@class) ของชั้นเรียนเป็นจุดที่ดีมาก! ขอบคุณ!
Philipp Otto

10

มีหนึ่ง caveat ถ้าคุณกำลังนำเข้ารหัส Swift ลงในไฟล์ Objective-C ของคุณภายในกรอบเดียวกัน คุณต้องทำด้วยการระบุชื่อกรอบและวงเล็บมุม:

#import <MyFramework/MyFramework-Swift.h>

MyFrameworkนี่คือการตั้งค่าการสร้าง "ชื่อโมดูลผลิตภัณฑ์" ( PRODUCT_NAME = MyFramework)

เพียงเพิ่ม#import "MyFramework-Swift.h"จะไม่ทำงาน หากคุณตรวจสอบไดเรกทอรีผลิตภัณฑ์ในตัว (ก่อนที่จะมีการ#importเพิ่มดังนั้นคุณจึงมีงานสร้างที่ประสบความสำเร็จอย่างน้อยหนึ่งรหัสด้วย Swift บางรหัสในเป้าหมาย) จากนั้นคุณควรเห็นไฟล์MyFramework-Swift.hในHeadersไดเรกทอรี


8

หากคุณมีโครงการที่สร้างขึ้นใน Swift 4 และเพิ่มไฟล์ Objective-C ให้ทำดังนี้:

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

การอ้างอิง: https://useyourloaf.com/blog/objc-warnings-upgrading-to-swift-4/


ในรหัสของฉันหลังจากที่ฉันอัปเดตเป็น Swift 4.2 จาก swift 3 มันไม่ทำงาน
15151

คุณได้รับข้อผิดพลาดอะไร ฉันใช้โค้ดด้านบนใน Swift4.2 และทำงานได้ดี
Prashant Bhayani

ตกลงดีมาก
Prashant Bhayani

4

ชำระเงินหมายเหตุก่อนวางจำหน่ายเกี่ยวกับ Swift และ Objective C ในโครงการเดียวกัน

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_75

คุณควรนำเข้า

#import "SCLAlertView-Swift.h"

3
แสดงให้ฉันเห็นข้อผิดพลาดนี้: ไม่พบไฟล์ 'SCLAlertView-Swift.h'
Viktor Radchenko

2
ต้องเป็นชื่อโครงการไม่ใช่ชื่อไฟล์ - ดูคำตอบของฉัน
Bill

1
ขอบคุณสำหรับลิงค์เอกสาร นั่นมีประโยชน์สำหรับการอ้างอิง
louielouie

2
เพื่ออ้างอิงจากลิงค์ที่ให้ไว้: The name of this header is your product module name followed by adding "-Swift.h".ดังนั้นจึงไม่ใช่ชื่อคลาสตามที่คุณเขียน แต่ชื่อของโมดูลผลิตภัณฑ์ของคุณและที่ดูแลการนำเข้าไฟล์ swift ทั้งหมดไม่ใช่เฉพาะเฉพาะ
Chris

4

ค้นหา"ชื่อส่วนหัวของอินเทอร์เฟซที่สร้าง C"ในการตั้งค่าการสร้างของเป้าหมายที่คุณกำลังพยายามสร้าง (สมมติว่ามันเป็นMyApp-Swift.h) และนำเข้ามูลค่าของการตั้งค่านี้ ( #import "MyApp-Swift.h") ในไฟล์ต้นฉบับที่คุณพยายามเข้าถึง Swift API ของคุณ

$(SWIFT_MODULE_NAME)-Swift.hค่าเริ่มต้นสำหรับฟิลด์นี้คือ คุณสามารถดูได้หากคุณดับเบิลคลิกในฟิลด์ค่าของการตั้งค่า "Objective-C Generated Interface Header Name"

นอกจากนี้หากคุณมีเครื่องหมายขีดกลางในชื่อโมดูลของคุณ (สมมติว่ามันเป็นMy-App) จากนั้น$(SWIFT_MODULE_NAME)เครื่องหมายขีดคั่นทั้งหมดจะถูกแทนที่ด้วยขีดล่าง #import "My_App-Swift.h"ดังนั้นแล้วคุณจะต้องเพิ่ม


ดีกว่าที่อนุมัติ ขีดกลางสูญเปล่า 20 นาทีฉันจะไม่กลับมาหาฮ่าฮ่า
ร้อยเอ็ด Mulia

3

หากคุณต้องการใช้ไฟล์SwiftในคลาสObjective-Cดังนั้นจาก Xcode 8 เป็นต้นไปคุณสามารถทำตามขั้นตอนด้านล่าง:

หากคุณได้สร้างโครงการใน Objective-C:

  1. สร้างไฟล์ Swift ใหม่
  2. Xcode จะแจ้งให้ไฟล์ Bridge-Headerโดยอัตโนมัติ
  3. สร้างมันขึ้นมา
  4. นำเข้า "ProjectName-Swift.h" ในคอนโทรลเลอร์ Objective-C ของคุณ (นำเข้าในการนำไปใช้ไม่ได้อยู่ในส่วนต่อประสาน) (หากโครงการของคุณมีช่องว่างระหว่างชื่อดังนั้นให้ใช้ขีดล่าง "Project_Name-Swift.h")
  5. คุณจะสามารถเข้าถึงคลาส Objective-C ของคุณใน Swift

รวบรวมมันและถ้ามันจะสร้างข้อผิดพลาด linker เช่น: รวบรวมกับรุ่นใหม่ของภาษา Swift (3.0) กว่าไฟล์ก่อนหน้า (2.0) สำหรับสถาปัตยกรรม x86_64 หรือ armv 7

ทำให้การเปลี่ยนแปลงของคุณอีกครั้งหนึ่ง

  1. Xcode -> Project -> Target -> Build Settings -> ใช้ Legacy Swift Language Version -> Yes

สร้างและเรียกใช้


1
ฉันไม่ได้รับตัวเลือกในการใช้งานรุ่นภาษา swift แบบดั้งเดิมนี้
rd_

1

ระวังด้วยขีดกลางและขีดล่างสามารถผสมกันได้และชื่อโครงการและชื่อเป้าหมายของคุณจะไม่เหมือนกับ SWIFT_MODULE_NAME

ขีดกลางและขีดล่าง


1
#import <TargetName-Swift.h>

คุณจะเห็นเมื่อคุณป้อนจากแป้นพิมพ์ #import <และหลังจาก Xcode อัตโนมัติจะแนะนำให้คุณ


-1

ค้นหาไฟล์. PCH ภายในโครงการ แล้วเพิ่ม #import "YourProjectName-Swift.h"สิ่งนี้จะนำเข้าส่วนหัวของชั้นเรียน เพื่อที่คุณจะได้ไม่ต้องนำเข้าไฟล์ที่ต้องการ

#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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.