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


974

ใน Swift หนึ่งเรียกรหัส Objective-C อย่างไร

Apple กล่าวว่าพวกเขาสามารถอยู่ร่วมในแอปพลิเคชันเดียวได้ แต่นี่หมายความว่าเราสามารถใช้คลาสเก่าที่สร้างขึ้นใหม่ใน Objective-C ในขณะที่สร้างคลาสใหม่ใน Swift ได้หรือไม่


13
โปรดดูที่คู่มือของ Apple ที่จะใช้สวิฟท์กับโกโก้และวัตถุประสงค์ -C
rickster


10
ที่น่าสนใจว่าคำถามนี้ได้รับ upvotes และเงินรางวัลมากมาย เมื่อฉันเห็นครั้งแรกฉันแค่คิดว่า: RTFM ดังที่แสดงไว้จริง ๆ แล้วไม่แสดงการวิจัยเนื่องจากขณะนี้มีทรัพยากรเพียงสองหรือสามอย่างที่จัดทำเอกสาร Swift อย่างเป็นทางการและหนึ่งในนั้นทุ่มเทอย่างเต็มที่กับสิ่งนี้ (และเชื่อมโยงกับความคิดเห็นแรก)
ไฟล์อนาล็อก

6
@EvolGate: อะไรคือสิ่งที่ขาดหายไปจาก Objective C ที่ป้องกันไม่ให้มันเป็นภาษาอิสระของแพลตฟอร์ม? ภาษาและไลบรารีมาตรฐานภาษาเป็นโอเพ่นซอร์ส คุณสามารถใช้ Objective C ในและสำหรับ Windows, Os X, Linux, BSD, Solaris และแพลตฟอร์มอื่น ๆ ที่รองรับโดย GCC หรือ LLVM คุณสามารถพอร์ต Objective C ไปยังแพลตฟอร์มใด ๆ ได้อย่างง่ายดายด้วยคอมไพเลอร์ C ที่เหมาะสมแม้ว่าจะรองรับ GCC หรือ LLVM ก็ตาม ฉันไม่เห็นว่ามันจะเป็นอิสระจากแพลตฟอร์มมากกว่านี้
ไฟล์อนาล็อก

2
@DavidMulder: ส่วน "การใช้เหตุผล" ยังคงจำเป็นหรือไม่
franck

คำตอบ:


1394

ใช้ Objective-C Classes ใน Swift

หากคุณมีระดับที่มีอยู่ที่คุณต้องการที่จะใช้ดำเนินการขั้นตอนที่ 2และจากนั้นข้ามไปขั้นตอนที่ 5 (สำหรับบางกรณีฉันต้องเพิ่มความชัดเจน#import <Foundation/Foundation.hลงในไฟล์ Objective-C รุ่นเก่ากว่า)

ขั้นตอนที่ 1: เพิ่มการใช้งาน Objective-C - .m

เพิ่มไฟล์ในชั้นเรียนของคุณและชื่อมัน.mCustomObject.m

ขั้นตอนที่ 2: เพิ่ม Bridging Header

เมื่อเพิ่ม.mไฟล์คุณอาจโดนพรอมต์ที่มีลักษณะดังนี้:

ไดอะล็อกสไตล์ชีท macOS จาก Xcode ถามว่าคุณต้องการ "ต้องการกำหนดค่าส่วนหัว Bridging ของ Objective-C หรือไม่"

คลิกใช่ !

หากคุณไม่ได้เห็นข้อความหรือเผลอลบส่วนหัวของการเชื่อมโยงของคุณเพิ่มใหม่ไฟล์โครงการของคุณและชื่อ.h<#YourProjectName#>-Bridging-Header.h

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

ภาพเคลื่อนไหวแสดงให้เห็นถึงวรรคข้างต้น

บันทึก:

เป็นวิธีปฏิบัติที่ดีที่สุดในการเชื่อมโยงโครงการของคุณโดยใช้$(SRCROOT)มาโครดังนั้นหากคุณย้ายโครงการของคุณหรือทำงานกับคนอื่น ๆ โดยใช้ที่เก็บระยะไกลมันจะยังใช้งานได้ $(SRCROOT)อาจถือได้ว่าเป็นไดเรกทอรีที่มีไฟล์. xcodeproj ของคุณ อาจมีลักษณะเช่นนี้:

$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h

ขั้นตอนที่ 3: เพิ่มวัตถุประสงค์ -C Header - .h

เพิ่มอีกไฟล์และชื่อ.hCustomObject.h

ขั้นตอนที่ 4: สร้างคลาส Objective-C ของคุณ

ใน CustomObject.h

#import <Foundation/Foundation.h>

@interface CustomObject : NSObject

@property (strong, nonatomic) id someProperty;

- (void) someMethod;

@end

ใน CustomObject.m

#import "CustomObject.h"

@implementation CustomObject 

- (void) someMethod {
    NSLog(@"SomeMethod Ran");
}

@end

ขั้นตอนที่ 5: เพิ่มคลาสให้กับ Bridging-Header

ในYourProject-Bridging-Header.h:

#import "CustomObject.h"

ขั้นตอนที่ 6: ใช้วัตถุของคุณ

ในSomeSwiftFile.swift:

var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()

ไม่จำเป็นต้องนำเข้าอย่างชัดเจน; นั่นคือสิ่งที่ Bridging header ใช้

การใช้คลาส Swift ใน Objective-C

ขั้นตอนที่ 1: สร้างคลาส Swift ใหม่

เพิ่มไฟล์ในโครงการของคุณและชื่อ.swiftMySwiftObject.swift

ในMySwiftObject.swift:

import Foundation

@objc(MySwiftObject)
class MySwiftObject : NSObject {

    @objc
    var someProperty: AnyObject = "Some Initializer Val" as NSString

    init() {}

    @objc
    func someFunction(someArg: Any) -> NSString {
        return "You sent me \(someArg)"
    }
}

ขั้นตอนที่ 2: นำเข้าไฟล์ Swift ไปยังคลาส ObjC

ในSomeRandomClass.m:

#import "<#YourProjectName#>-Swift.h"

ไฟล์: <#YourProjectName#>-Swift.hควรถูกสร้างขึ้นโดยอัตโนมัติในโครงการของคุณแม้ว่าคุณจะไม่เห็นก็ตาม

ขั้นตอนที่ 3: ใช้คลาสของคุณ

MySwiftObject * myOb = [MySwiftObject new];
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);
myOb.someProperty = @"Hello World";
NSLog(@"MyOb.someProperty: %@", myOb.someProperty);

NSString * retString = [myOb someFunctionWithSomeArg:@"Arg"];

NSLog(@"RetString: %@", retString);

หมายเหตุ:

  1. หากการเสร็จสิ้นโค้ดไม่ทำงานตามที่คุณคาดหวังให้ลองเรียกใช้งานบิลด์อย่างรวดเร็วRเพื่อช่วยให้ Xcode ค้นหาโค้ด Objective-C บางส่วนจากบริบท Swift และในทางกลับกัน

  2. ถ้าคุณเพิ่ม.swiftไฟล์ไปยังโครงการเก่าและได้รับข้อผิดพลาดdyld: Library not loaded: @rpath/libswift_stdlib_core.dylibลองสมบูรณ์รีสตาร์ท Xcode

  3. แม้ว่าในขั้นต้นจะเป็นไปได้ที่จะใช้คลาส Swift ล้วนๆ (ไม่ใช่ส่วนที่สืบทอดNSObject) ซึ่งสามารถมองเห็นได้ด้วย Objective-C โดยใช้ส่วน@objcนำหน้า แต่ไม่สามารถทำได้อีกต่อไป ตอนนี้ที่จะมองเห็นได้ใน Objective-C, วัตถุ Swift อย่างใดอย่างหนึ่งจะต้องมีชั้นเรียนที่สอดคล้องกับNSObjectProtocol(วิธีที่ง่ายที่สุดที่จะทำนี้คือการสืบทอดจากNSObject) หรือจะเป็นenumการทำเครื่องหมายที่มีมูลค่าดิบชนิดจำนวนเต็มบางอย่างเช่น@objc คุณสามารถดูประวัติการแก้ไขสำหรับตัวอย่างโค้ด Swift 1.x ที่ใช้โดยไม่มีข้อ จำกัด เหล่านี้Int@objc


5
เป็นสิ่งสำคัญที่คุณต้องใส่คำอธิบายประกอบวิธีการด้วย @objc หรือวิธีการ Swift จะไม่สามารถมองเห็นได้จาก Objective-C
Tomáš Linhart

29
คุณพูดถูก คุณจะต้องระบุมันหากคุณไม่ได้ใช้วัตถุโกโก้ เพื่อให้สามารถเข้าถึงและใช้งานได้ใน Objective-C คลาส Swift จะต้องเป็นลูกหลานของคลาส Objective-C หรือต้องระบุ @objc
Tomáš Linhart

2
@MarkusRautopuro - รับได้จากที่นี่: developer.apple.com/library/prerelease/ios/documentation/Swift/… "
Logan

2
ดูเพิ่มเติมที่: WWDC 2014 เซสชัน 406: การรวม Swift เข้ากับ Objective-C
Stuart M

6
หากการนำเข้ากรอบงาน Objective C ไปที่ Swift ตรวจสอบให้แน่ใจว่าได้นำเข้ากรอบงานทั้งหมดที่กรอบงาน Obj C ขึ้นอยู่กับโครงการของคุณ (ใน Build Phases -> Link Binary With Libraries) จากนั้นเพิ่ม # import เข้าสู่ไฟล์ส่วนหัวคำนำหน้า จะต้องเพิ่มในโครงการของคุณในการตั้งค่าการสร้าง (ในฟิลด์ส่วนหัวของคำนำหน้า) ซึ่งรวมถึงเฟรมเวิร์กเช่น UIKit และมูลนิธิแม้ว่าจะถูกใช้จากภายใน Swift อยู่แล้ว สิ่งนี้ทำให้ฉันสะดุดเป็นเวลาหลายชั่วโมงและดูเหมือนไม่มีใครทำเอกสารขั้นตอนเหล่านี้
user1021430

121

โปรดดูที่คู่มือของ Apple ที่จะใช้สวิฟท์กับโกโก้และวัตถุประสงค์ -C คู่มือนี้ครอบคลุมถึงวิธีการใช้รหัส Objective-C และ C จาก Swift และในทางกลับกันและมีคำแนะนำสำหรับการแปลงโครงการหรือผสมและจับคู่ Objective-C / C และ Swift ในโครงการที่มีอยู่

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

UITableView *myTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStyleGrouped];

เปลี่ยนเป็นรหัส Swift นี้:

let myTableView: UITableView = UITableView(frame: CGRectZero, style: .Grouped)

Xcode ยังทำการแปลนี้ทันทีคุณสามารถใช้ Open Quickly ในขณะที่แก้ไขไฟล์ Swift และพิมพ์ชื่อคลาส Objective-C และจะนำคุณไปยังส่วนหัวของคลาสเวอร์ชัน Swift-ified (คุณสามารถรับสิ่งนี้ได้โดยการคลิก cmd ที่สัญลักษณ์ API ในไฟล์ Swift) และเอกสารอ้างอิง API ทั้งหมดในiOS 8และOS X v10.10 (Yosemite)ห้องสมุดนักพัฒนาสามารถมองเห็นได้ทั้งใน Objective-C และ Swift แบบฟอร์ม (เช่นUIView)


3
ลิงก์โดยตรงไปยังเอกสารประกอบของ Appleวิธีการรวม Swift ในโครงการที่มีอยู่: developer.apple.com/library/prerelease/ios/documentation/Swift/…
skywinder

หากเราสนใจว่าทำไมไฟล์ส่วนหัวจึงมีความจำเป็นและวิธีการใช้ในระหว่างขั้นตอนการเชื่อมโยงให้แน่ใจว่าคุณอ่านManual Swift
Honey

62

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

  1. เพิ่มไฟล์ Objective-C ใด ๆ ลงในโครงการ Swift ของคุณโดยเลือกไฟล์ -> ใหม่ -> ไฟล์ใหม่ -> ไฟล์ Objective-C เมื่อทำการบันทึกXcode จะถามว่าคุณต้องการเพิ่มส่วนหัวการเชื่อมโยงหรือไม่ เลือก ' ใช่ ' (ที่มา: derrrick.com )Gif: การเพิ่มไฟล์เปล่าในโครงการและสร้างส่วนหัวการเชื่อมโยง

ในขั้นตอนง่าย ๆ :

  1. ข้อความแจ้งจะปรากฏขึ้นจากนั้นคลิกที่ OK ... หากไม่ปรากฏขึ้นเราจะสร้างขึ้นเองดังต่อไปนี้ ... สร้างไฟล์ส่วนหัวหนึ่งไฟล์จากแหล่ง iOS และตั้งชื่อ ProjectName-Bridging-Header (ตัวอย่าง: ทดสอบ -Bridging-Header) จากนั้นไปที่การสร้างการตั้งค่าในรหัสคอมไพเลอร์ Swift -> Objective-C bridge เพิ่มชื่อ Objective-C bridge .. (Test / Test-Bridging-Header.h) ใช่แล้วเสร็จแล้ว

  2. เลือกลบไฟล์ Objective-C ที่คุณเพิ่ม (ชื่อ "อะไร" ในภาพ GIF ด้านบน) คุณไม่ต้องการมันอีกแล้ว

  3. เปิดไฟล์ส่วนหัวแก้ - ชื่อไฟล์จะอยู่ในรูป[YourProject] -Bridging-Header.h มันรวมถึงการแสดงความคิดเห็นให้ Xcode เพิ่มบรรทัดโค้ดสำหรับไฟล์ Objective-C ที่คุณต้องการรวมเช่นเฟรมเวิร์กของบุคคลที่สาม ตัวอย่างเช่นหากต้องการเพิ่ม Mixpanel ในโครงการของคุณคุณจะต้องเพิ่มบรรทัดของรหัสต่อไปนี้ลงในไฟล์ส่วนหัวการเชื่อมโยง:

    #import "Mixpanel.h"
  4. ตอนนี้ในไฟล์ Swift ใด ๆ ที่คุณสามารถใช้รหัส Objective-C ที่มีอยู่ในไวยากรณ์ Swift (ในกรณีของตัวอย่างนี้และคุณสามารถเรียกวิธี Mixpanel SDK และอื่น ๆ ) คุณต้องทำความคุ้นเคยกับวิธีที่ Xcode แปล Objective-C เป็น Swift คำแนะนำของ Appleอ่านได้อย่างรวดเร็ว หรือดูคำตอบนี้สำหรับการสรุปที่ไม่สมบูรณ์

ตัวอย่างสำหรับ Mixpanel:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    Mixpanel.sharedInstanceWithToken("your-token")
    return true
}

แค่นั้นแหละ!

หมายเหตุ: หากคุณลบไฟล์ส่วนหัวการเชื่อมโยงออกจากโครงการของคุณให้แน่ใจว่าได้เข้าไปในการตั้งค่าการสร้างและลบค่าสำหรับ " ส่วนหัว Bridging-C วัตถุประสงค์ " ภายใต้ "Swift Compiler - การสร้างรหัส"


39

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

let manager = AFHTTPRequestOperationManager()
manager.GET(
  "http://example.com/resources.json",
  parameters: nil,
  success: { (operation: AFHTTPRequestOperation!,
              responseObject: AnyObject!) in
      println("JSON: " + responseObject.description)
  },
  failure: { (operation: AFHTTPRequestOperation!,
              error: NSError!) in
      println("Error: " + error.localizedDescription)
  })

ดูเอกสารของ Apple โดยใช้ Swift กับ Cocoa และ Objective-Cด้วย


25

ฉันเขียนโครงการ Xcode 6 อย่างง่ายที่แสดงวิธีผสม C ++, Objective-C และ Swift code:

https://github.com/romitagl/shared/tree/master/C-ObjC-Swift/Performance_Console

โดยเฉพาะอย่างยิ่งตัวอย่างเรียก Objective-C และ C ++ ฟังก์ชั่นจากสวิฟท์

กุญแจสำคัญคือการสร้างส่วนหัวที่ใช้ร่วมกัน Project-Bridging-Header.h และวางส่วนหัว Objective-C ไว้ที่นั่น

โปรดดาวน์โหลดโครงการเป็นตัวอย่างที่สมบูรณ์


24

อีกหนึ่งสิ่งที่ฉันต้องการเพิ่มที่นี่:

ฉันขอบคุณมากสำหรับคำตอบของ @ Logan ช่วยได้มากในการสร้างไฟล์บริดจ์และการตั้งค่า

แต่หลังจากทำตามขั้นตอนเหล่านี้แล้วฉันยังไม่ได้รับคลาส Objective-C ใน Swift

ฉันใช้cocoapodsห้องสมุดและรวมเข้ากับโครงการของฉัน pod "pop"ซึ่งเป็น

ดังนั้นหากคุณใช้ Objective-C พ็อดใน Swift อาจมีโอกาสที่คุณจะไม่สามารถรับหรือimportเรียนใน Swift ได้

สิ่งง่าย ๆ ที่คุณต้องทำคือ:

  1. ไปที่<YOUR-PROJECT>-Bridging-Headerไฟล์และ
  2. แทนที่คำสั่ง#import <ObjC_Framework>เป็น@import ObjC_Framework

ตัวอย่างเช่น: (ห้องสมุดป๊อป)

แทนที่

#import <pop/POP.h>

กับ

@import pop;

ใช้clang importเมื่อ#importไม่ทำงาน


ใช้การนำเข้าเสียงดังกราวเมื่อ #import ไม่ทำงาน อะไร? ไม่เพียงแค่บอกว่าเราควรใช้ @import หรือไม่!
น้ำผึ้ง

22

อ้างจากเอกสาร :

เฟรมเวิร์ก Objective-C ใด ๆ (หรือไลบรารี C) ที่สามารถเข้าถึงได้เนื่องจากโมดูลสามารถนำเข้าสู่ Swift ได้โดยตรง ซึ่งรวมถึงกรอบระบบ Objective-C ทั้งหมด - เช่น Foundation, UIKit และ SpriteKit— รวมถึงไลบรารี C ทั่วไปที่จัดมาให้พร้อมกับระบบ ตัวอย่างเช่นหากต้องการนำเข้า Foundation เพียงเพิ่มคำสั่งนำเข้านี้ไปที่ด้านบนของไฟล์ Swift ที่คุณกำลังใช้งาน:

import Foundation

การนำเข้านี้ทำให้ API พื้นฐานทั้งหมดรวมถึง NSDate, NSURL, NSMutableData และวิธีการคุณสมบัติและหมวดหมู่ทั้งหมดของพวกเขามีให้บริการโดยตรงใน Swift


12

เพียงแค่ทราบสำหรับใครก็ตามที่พยายามที่จะเพิ่มไลบรารี Objective-C ถึงสวิฟท์: คุณควรเพิ่ม-ObjCในการตั้งค่ารูปร่าง -> การเชื่อมโยง -> ธง Linker อื่น ๆ


ทำไม? โปรดเพิ่มข้อมูลเกี่ยวกับการตั้งค่าสถานะนี้และทำไมจึงควรเพิ่ม
Johan Karlsson

9

หลังจากที่คุณสร้างส่วนหัวของ Bridging ให้ไปที่ Build Setting => ค้นหา "Objective-C Bridging Header"

ด้านล่างคุณจะพบไฟล์ "" ชื่อส่วนหัวของอินเทอร์เฟซที่สร้างขึ้น C "

นำเข้าไฟล์นั้นในตัวควบคุมมุมมองของคุณ

ตัวอย่าง: ในกรณีของฉัน: "Dauble-Swift.h"

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


5

คลิกที่ใหม่เมนูไฟล์และเลือกไฟล์เลือกภาษาวัตถุประสงค์ ในเวลานั้นมันจะสร้างไฟล์ "Objective-C Bridging Header" โดยอัตโนมัติซึ่งใช้เพื่อกำหนดชื่อคลาสบางส่วน

"Objective-C Bridging Header" ภายใต้ "Swift Compiler - การสร้างรหัส"


3
  1. สร้างไฟล์. h จาก NewFile -> Source -> ไฟล์ส่วนหัว
  2. จากนั้นบันทึกชื่อไฟล์ Your_Target_Name-Bridging-Header.h คนที่นี่ได้รับข้อผิดพลาดทั่วไปโดยใช้ชื่อโครงการของพวกเขา แต่ควรเป็นชื่อเป้าหมายของโครงการหากในกรณีที่ทั้งสองแตกต่างกันโดยทั่วไปพวกเขาจะเหมือนกัน
  3. จากนั้นในการตั้งค่าบิวด์ค้นหาObjective-C Bridging Header flag และใส่ที่อยู่ของไฟล์ Bridging ที่สร้างขึ้นใหม่ของคุณคุณสามารถคลิกขวาที่ไฟล์ -> แสดงใน Finder -> ลากไฟล์ในพื้นที่ข้อความจากนั้นที่อยู่จะ จะมีประชากร
  4. ใช้ #import Your_Objective-C_file.h
  5. ในไฟล์ swift คุณสามารถเข้าถึงไฟล์ ObjC แต่เป็นภาษา swift เท่านั้น

3

ป้อนคำอธิบายรูปภาพที่นี่ฉันได้เพิ่มโครงการบน GitHub ที่มีตัวอย่างเล็ก ๆ เพื่อเรียกรหัสวัตถุประสงค์ c จาก swift

เรียกคลาส ObjectiveC จาก swift


หมายเหตุ: - เมื่อคุณสร้างคลาส Objc ในโครงการที่รวดเร็วกว่า xcode จะขอให้เชื่อมคลาสโดยอัตโนมัติ ไม่ต้องกังวล :)
CrazyPro007

3

ในโครงการ Swift 4.2.1 ใน Xcode 10.1 คุณสามารถเพิ่มไฟล์ Objective-C ได้อย่างง่ายดาย ทำตามขั้นตอนด้านล่างเพื่อเชื่อมไฟล์ Objective-C กับโครงการ Swift

Step_01: สร้างโครงการ Xcode ใหม่โดยใช้ภาษา Swift:

File> New> >Projectobjc

Step_02: ในโครงการ Swift เพิ่มไฟล์ Objective-C ใหม่:

File> New> File...> >macOSObjective-C File

Step_03: หากคุณเพิ่มไฟล์ Objective-C ใหม่ในโครงการ Swift ในครั้งแรก Xcode จะถามคุณ:

Would you like to configure an Objective-C bridging header?

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

Step_04: เลือกตัวเลือก:

Create Bridging Header.

Step_05: ไฟล์ที่เกี่ยวข้องจะถูกสร้างขึ้นด้วยชื่อ:

Objc-Bridging-Header.h.

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

Step_06: ตอนนี้คุณต้องตั้งค่าพา ธ ไฟล์ Bridge ในส่วนหัวของบริดจ์ ใน Project Navigator คลิกที่ชื่อโครงการobjcแล้วเลือก:

Build Settings> >Objective-C Bridging HeaderObjc-Bridging-Header.h

Step_07: ลากแล้วปล่อยของคุณObjc-Bridging-Header.hลงในกล่องเพื่อสร้างเส้นทางไฟล์

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

Step_08: เปิดObjc-Bridging-Header.hไฟล์ของคุณและนำเข้าไฟล์ Objective-C ที่คุณต้องการใช้ในไฟล์ Swift ของคุณ

#import "SpecialObjcFile.m"

นี่คือเนื้อหาของSpecialObjcFile.m:

#import <Foundation/Foundation.h>

@interface Person: NSObject {
@public
    bool busy;
}
@property
    bool busy;
@end

Step_09: ในไฟล์ Swift ของคุณคุณสามารถใช้คลาส Objective-C:

override func viewDidLoad() {
    super.viewDidLoad()
    let myObjcContent = Person()
    print(myObjcContent.busy)
}

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


1

Logans คำตอบที่ทำงานได้ดียกเว้นในรุ่นล่าสุดSwift 5จะช่วยให้รวบรวมข้อผิดพลาดบางอย่าง นี่คือการแก้ไขสำหรับผู้ที่ทำงานกับ Swift 5

สวิฟท์ 5

import Foundation

class MySwiftObject : NSObject {

    var someProperty: AnyObject = "Some Initializer Val" as AnyObject

    override init() {}

    func someFunction(someArg:AnyObject) -> String {
        let returnVal = "You sent me \(someArg)"
        return returnVal
    }
}

1

ผู้บริโภคอย่างรวดเร็วผู้ผลิต Objective-C

  1. เพิ่มส่วนหัว.hและ.mไฟล์การใช้งาน- ไฟล์คลาส Cocoa (Objective-C)
    ตัวอย่างเช่นMyFileName

  2. กำหนดค่าการเชื่อมต่อส่วนหัว
    เมื่อคุณเห็นWould you like to configure an Objective-C bridging headerคลิก - ใช่

    • <target_name>-Bridging-Header.h จะถูกสร้างขึ้นโดยอัตโนมัติ
    • การตั้งค่าการสร้าง -> วัตถุประสงค์ -C Bridging Header
  3. เพิ่มคลาสให้กับ Bridging-Header
    In <target_name>-Bridging-Header.hเพิ่มบรรทัด#import "<MyFileName>.h"

PS หากคุณควรเพิ่มไฟล์ Objective-C ที่มีอยู่ลงใน Swift project ให้เพิ่มBridging-Header.hไว้ล่วงหน้า

ผู้บริโภค Objective-C ผู้ผลิต Swift

  1. เพิ่ม<MyFileName>.swiftและขยายNSObject

  2. นำเข้าไฟล์ Swift ไปที่ ObjC Class
    Add#import "<#YourProjectName#>-Swift.h"ลงในไฟล์ Objective-C ของคุณ

  3. ทำเครื่องหมายรหัส Swift สาธารณะ[@objc และ @objcMembers]


0

Apple ได้ให้คำแนะนำอย่างเป็นทางการในเอกสารนี้: วิธีการโทรหาวัตถุประสงค์ -c-code-from-swift

นี่คือส่วนที่เกี่ยวข้อง:

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

หากคุณยอมรับ Xcode จะสร้างไฟล์ส่วนหัวการเชื่อมโยงพร้อมกับไฟล์ที่คุณกำลังสร้างและตั้งชื่อโดยใช้ชื่อโมดูลผลิตภัณฑ์ของคุณตามด้วย "-Bridging-Header.h" หรือคุณสามารถสร้างส่วนหัวการเชื่อมโยงตัวเองโดยเลือกไฟล์> ใหม่> ไฟล์> [ระบบปฏิบัติการ]> ที่มา> ไฟล์ส่วนหัว

แก้ไขส่วนหัว bridging เพื่อแสดงรหัส Objective-C ของคุณเป็นรหัส Swift ของคุณ:

  1. ในส่วนหัวของการแก้ Objective-C ของคุณนำเข้าทุกส่วนหัว Objective-C คุณต้องการที่จะสัมผัสกับสวิฟท์
  2. ในการตั้งค่าการสร้างใน Swift Compiler - การสร้างรหัสตรวจสอบให้แน่ใจว่าการตั้งค่าการสร้างส่วนหัว Bridging Header วัตถุประสงค์มีเส้นทางไปยังไฟล์ส่วนหัวการเชื่อมต่อ เส้นทางควรสัมพันธ์กับโครงการของคุณคล้ายกับที่ระบุในพา ธ Info.plist ใน Build Settings ในกรณีส่วนใหญ่คุณไม่จำเป็นต้องแก้ไขการตั้งค่านี้

ส่วนหัว Objective-C สาธารณะใด ๆ ที่ระบุไว้ในส่วนหัวการเชื่อมต่อจะปรากฏต่อ Swift


0

วิธีการสองวิธีในการใช้วัตถุประสงค์ -c

1

  1. สร้างไฟล์ bridge-header.h ในโครงการ Xcode
  2. นำเข้าไฟล์. h ในไฟล์ bridge-Header
  3. กำหนดเส้นทางของ Bridge-Header ในการตั้งค่า Build
  4. ทำความสะอาดโครงการ

2

  1. สร้างไฟล์ -c วัตถุประสงค์ในโครงการ (มันจะกำหนดเส้นทางโดยอัตโนมัติในการตั้งค่าการสร้างสำหรับคุณ)
  2. นำเข้าไฟล์. h ในไฟล์ bridge-Header

ดีไปแล้ว ขอบคุณ

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