Menggunakan Kelas Objective-C di Swift
Jika Anda memiliki kelas yang sudah ada yang ingin Anda gunakan, lakukan Langkah 2 dan kemudian lewati ke Langkah 5 . (Untuk beberapa kasus, saya harus menambahkan eksplisit #import <Foundation/Foundation.h
ke File Objective-C yang lebih lama.)
Langkah 1: Tambahkan Implementasi Objective-C - .m
Tambahkan .m
file ke kelas Anda, dan beri nama CustomObject.m
.
Langkah 2: Tambahkan Bridging Header
Saat menambahkan .m
file Anda, Anda akan dipukul dengan prompt yang terlihat seperti ini:
Klik Ya !
Jika Anda tidak melihat prompt, atau secara tidak sengaja menghapus header bridging Anda, tambahkan .h
file baru ke proyek Anda dan beri nama<#YourProjectName#>-Bridging-Header.h
.
Dalam beberapa situasi, terutama ketika bekerja dengan kerangka kerja Objective-C, Anda tidak menambahkan kelas Objective-C secara eksplisit dan Xcode tidak dapat menemukan tautan. Dalam hal ini, buat .h
file Anda dengan nama yang disebutkan di atas, lalu pastikan Anda menautkan lintasannya di pengaturan proyek target Anda seperti:
catatan:
Praktik terbaik untuk menautkan proyek Anda menggunakan $(SRCROOT)
makro sehingga jika Anda memindahkan proyek Anda, atau mengerjakannya dengan orang lain menggunakan repositori jarak jauh, itu akan tetap berfungsi. $(SRCROOT)
dapat dianggap sebagai direktori yang berisi file .xcodeproj Anda. Mungkin terlihat seperti ini:
$(SRCROOT)/Folder/Folder/<#YourProjectName#>-Bridging-Header.h
Langkah 3: Tambahkan Header Objective-C - .h
Tambahkan .h
file lain dan beri namaCustomObject.h
.
Langkah 4: Bangun Kelas Objective-C Anda
Di CustomObject.h
#import <Foundation/Foundation.h>
@interface CustomObject : NSObject
@property (strong, nonatomic) id someProperty;
- (void) someMethod;
@end
Di CustomObject.m
#import "CustomObject.h"
@implementation CustomObject
- (void) someMethod {
NSLog(@"SomeMethod Ran");
}
@end
Langkah 5: Tambahkan Kelas ke Bridging-Header
Dalam YourProject-Bridging-Header.h
:
#import "CustomObject.h"
Langkah 6: Gunakan Objek Anda
Dalam SomeSwiftFile.swift
:
var instanceOfCustomObject = CustomObject()
instanceOfCustomObject.someProperty = "Hello World"
print(instanceOfCustomObject.someProperty)
instanceOfCustomObject.someMethod()
Tidak perlu mengimpor secara eksplisit; itulah gunanya header penghubung.
Menggunakan Kelas Swift di Objective-C
Langkah 1: Buat Kelas Swift Baru
Tambahkan .swift
file ke proyek Anda, dan beri nama MySwiftObject.swift
.
Dalam 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)"
}
}
Langkah 2: Impor File Swift ke ObjC Class
Dalam SomeRandomClass.m
:
#import "<#YourProjectName#>-Swift.h"
File: <#YourProjectName#>-Swift.h
seharusnya sudah dibuat secara otomatis di proyek Anda, bahkan jika Anda tidak dapat melihatnya.
Langkah 3: Gunakan kelas Anda
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);
Catatan:
Jika Penyelesaian Kode tidak berlaku seperti yang Anda harapkan, coba jalankan build cepat dengan ⌘⇧Runtuk membantu Xcode menemukan beberapa kode Objective-C dari konteks Swift dan sebaliknya.
Jika Anda menambahkan .swift
file ke proyek yang lebih lama dan mendapatkan kesalahan dyld: Library not loaded: @rpath/libswift_stdlib_core.dylib
, coba restart Xcode sepenuhnya .
Meskipun pada awalnya dimungkinkan untuk menggunakan kelas Swift murni (Bukan turunan NSObject
) yang terlihat oleh Objective-C dengan menggunakan @objc
awalan, ini tidak lagi mungkin. Sekarang, agar terlihat di Objective-C, objek Swift harus berupa kelas yang sesuai NSObjectProtocol
(cara termudah untuk melakukan ini adalah mewarisi dari NSObject
), atau enum
ditandai @objc
dengan nilai mentah dari beberapa tipe integer seperti Int
. Anda dapat melihat histori edit untuk contoh kode Swift 1.x menggunakan @objc
tanpa batasan ini.