ฉันเขียนห้องสมุดใน Swift และฉันไม่สามารถนำเข้าสู่โครงการปัจจุบันของฉันเขียนใน Objective-C
มีวิธีการนำเข้าหรือไม่
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
ฉันเขียนห้องสมุดใน Swift และฉันไม่สามารถนำเข้าสู่โครงการปัจจุบันของฉันเขียนใน Objective-C
มีวิธีการนำเข้าหรือไม่
#import "SCLAlertView.swift" - 'SCLAlertView.swift' file not found
คำตอบ:
TargetName-Swift.h
คุณจำเป็นต้องนำเข้า โปรดทราบว่ามันคือชื่อเป้าหมาย - คำตอบอื่น ๆ สร้างความผิดพลาดในการใช้ชื่อคลาส
นี้ไฟล์เดียวเป็นส่วนหัวที่สร้างโดยอัตโนมัติว่าอินเตอร์เฟซที่กำหนดวัตถุประสงค์ -C สำหรับทุกชั้นเรียนสวิฟท์ในโครงการของคุณที่มีข้อเขียนทั้งที่มีหรือรับมรดกจาก@objc
NSObject
การพิจารณา:
หากชื่อเป้าหมายของคุณมีช่องว่างให้แทนที่ด้วยช่องว่าง (เช่นMy Project
กลายเป็นMy_Project-Swift.h
)
หากเป้าหมายของคุณเป็นกรอบคุณต้องนำเข้า <TargetName/TargetName-Swift.h>
ตรวจสอบให้แน่ใจว่าไฟล์ Swift ของคุณเป็นสมาชิกของเป้าหมาย
คำแนะนำจากเว็บไซต์ 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
NSObject
!!! คุณไม่สามารถบอกได้class Blah
อย่างรวดเร็วและทำงานได้ มันต้องเป็นclass Blah : NSObject
นี่คือสิ่งที่ต้องทำ:
สร้างโครงการใหม่ใน Objective-C
สร้าง.swift
ไฟล์
ใหม่
คลิกที่ไฟล์ Xcode Projectของคุณ
คลิกที่การตั้งค่าการสร้าง
ค้นหาแถบค้นหาและค้นหากำหนดโมดูล
การเปลี่ยนแปลงมูลค่าให้ใช่
ค้นหาสินค้าชื่อโมดูล
เปลี่ยนค่าเป็นชื่อโครงการของคุณ
ในตัวแทนแอปเพิ่มสิ่งต่อไปนี้: #import "YourProjectName-Swift.h"
หมายเหตุ: เมื่อใดก็ตามที่คุณต้องการใช้ไฟล์ Swift คุณจะต้องนำเข้าบรรทัดต่อไปนี้:
#import "YourProjectName-Swift.h"
Defines module
ในBuild settings
ที่จะYes
เป็นสิ่งที่คงที่สิ่งที่ฉัน!
YourProjectName
ใน#import "YourProjectName-Swift.h"
นั้นจะเป็นชื่อของโครงการจากขั้นตอนที่ 8 มีประโยชน์ถ้าชื่อโครงการของคุณมีอักขระพิเศษและคุณไม่แน่ใจว่าคุณควรจัดรูปแบบอย่างไร
ไปที่การตั้งค่าในการสร้างไฟล์โครงการของคุณและค้นหา"Objective-C สร้างการเชื่อมต่อของชื่อส่วนหัว . มูลค่าของทรัพย์สินที่เป็นชื่อที่คุณควรจะรวมถึง
หากคุณสมบัติ "ชื่อโมดูลผลิตภัณฑ์" ของคุณ (ชื่อที่คุณสมบัติด้านบนขึ้นอยู่กับค่าเริ่มต้น) จะแตกต่างกันไปขึ้นอยู่กับว่าคุณได้ทำการคอมไพล์สำหรับการทดสอบ / debug / release / etc (เช่นเดียวกับที่ใช้ในกรณีของฉัน) รูปแบบโดยการตั้งชื่อที่กำหนดเอง
การนำเข้าSwift
ไฟล์ด้านในObjective-c
อาจทำให้เกิดข้อผิดพลาดนี้หากไม่import
ถูกต้อง
หมายเหตุ: คุณไม่จำเป็นต้องนำเข้าไฟล์ Swift จากภายนอกคุณเพียงแค่นำเข้าไฟล์เดียวซึ่งดูแลไฟล์ swift
เมื่อคุณสร้าง / ไฟล์คัดลอก Swiftภายในโครงการ Objective-C มันจะสร้างส่วนหัว bridging โดยอัตโนมัติ
ตรวจสอบที่ Objective-C Generated Interface Header Name
Targets -> Build Settings
จากข้างต้นฉันจะนำเข้าKJExpandable-Swift.h
เหมือนเดิม
สิ่งที่คุณจะทำTargetName-Swift.h
คือTargetName
แตกต่างกันไปตามชื่อโครงการของคุณหรือเป้าหมายอื่นที่คุณอาจเพิ่มและดำเนินการอยู่
ต่ำกว่าเป้าหมายของฉันKJExpandable
ดังนั้นมันเป็นKJExpandable-Swift.h
ขั้นแรก:-
เลือกเป้าหมายโครงการ -> การตั้งค่าการสร้าง -> ค้นหา ('กำหนด') -> กำหนด ค่าการปรับปรุงโมดูลไม่ใช่เป็นใช่
"กำหนดโมดูล": 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"
มีหนึ่ง caveat ถ้าคุณกำลังนำเข้ารหัส Swift ลงในไฟล์ Objective-C ของคุณภายในกรอบเดียวกัน คุณต้องทำด้วยการระบุชื่อกรอบและวงเล็บมุม:
#import <MyFramework/MyFramework-Swift.h>
MyFramework
นี่คือการตั้งค่าการสร้าง "ชื่อโมดูลผลิตภัณฑ์" ( PRODUCT_NAME = MyFramework
)
เพียงเพิ่ม#import "MyFramework-Swift.h"
จะไม่ทำงาน หากคุณตรวจสอบไดเรกทอรีผลิตภัณฑ์ในตัว (ก่อนที่จะมีการ#import
เพิ่มดังนั้นคุณจึงมีงานสร้างที่ประสบความสำเร็จอย่างน้อยหนึ่งรหัสด้วย Swift บางรหัสในเป้าหมาย) จากนั้นคุณควรเห็นไฟล์MyFramework-Swift.h
ในHeaders
ไดเรกทอรี
หากคุณมีโครงการที่สร้างขึ้นใน 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 และ Objective C ในโครงการเดียวกัน
คุณควรนำเข้า
#import "SCLAlertView-Swift.h"
The name of this header is your product module name followed by adding "-Swift.h".
ดังนั้นจึงไม่ใช่ชื่อคลาสตามที่คุณเขียน แต่ชื่อของโมดูลผลิตภัณฑ์ของคุณและที่ดูแลการนำเข้าไฟล์ swift ทั้งหมดไม่ใช่เฉพาะเฉพาะ
ค้นหา"ชื่อส่วนหัวของอินเทอร์เฟซที่สร้าง 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"
ดังนั้นแล้วคุณจะต้องเพิ่ม
หากคุณต้องการใช้ไฟล์SwiftในคลาสObjective-Cดังนั้นจาก Xcode 8 เป็นต้นไปคุณสามารถทำตามขั้นตอนด้านล่าง:
หากคุณได้สร้างโครงการใน Objective-C:
รวบรวมมันและถ้ามันจะสร้างข้อผิดพลาด linker เช่น: รวบรวมกับรุ่นใหม่ของภาษา Swift (3.0) กว่าไฟล์ก่อนหน้า (2.0) สำหรับสถาปัตยกรรม x86_64 หรือ armv 7
ทำให้การเปลี่ยนแปลงของคุณอีกครั้งหนึ่ง
สร้างและเรียกใช้
ระวังด้วยขีดกลางและขีดล่างสามารถผสมกันได้และชื่อโครงการและชื่อเป้าหมายของคุณจะไม่เหมือนกับ SWIFT_MODULE_NAME
#import <TargetName-Swift.h>
คุณจะเห็นเมื่อคุณป้อนจากแป้นพิมพ์ #import <และหลังจาก Xcode อัตโนมัติจะแนะนำให้คุณ
ค้นหาไฟล์. 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