標籤:var clu otto tdd prolog hand ade res 錯誤
1. 首先開啟Xcode6。建立一個項目,這裡我使用的Objective-C預設的程式設計語言,項目名字叫 “SwiftAndObjective”。
2. 為了在OC中使用Swift的示範所以須要建立以下的幾個類。
a)建立一個Objective-C的類繼承自NSObject。名字叫OCTypeClass, 所以會自己主動產生兩個相應的 .m 和 .h檔案,這對熟悉Objective-C的人很熟悉。
b) 儘力一個Swift類,名字叫SwiftFile1, 在點擊建立的時候,會彈出一個提示問是否建立一個hander .h檔案,這裡必須選擇是。
由於假設想要在Swift中使用Objective-C的類的話,這是一個必備檔案,詳細使用稍後再說。
結果會建立一個SwiftFile1.swift檔案和一個header檔案。
c)為了描寫敘述訪問控制符public、private、預設等的關係。須要再建立一個Swift檔案,名字叫SwiftFile2,會產生一個SwiftFile2.swift的檔案。
好了檔案建立部分完成。
3. 須要定義類(由於swift能夠不繼承不論什麼類。可是假設須要被Objective-C使用的時候,我們使用的alloc,new等建立使用的方法是繼承自NSObject的,所以Swift中的這些類。我都繼承了NSObject了)。
在SwiftFile1.swift檔案裡建立以下的類
import Foundation@objc public class PublicObjcTypeSwiftClass1: NSObject { var property1: Int = 0}@objc class ObjcTypeSwiftClass1: NSObject { var property1: Int = 0}@objc private class ObjcPrivateTypeSwiftClass1: NSObject { var property1: Int = 0}public class PublicSwiftClass1 : NSObject { var property1: Int = 0}class SwiftClass1: NSObject { var property1: Int = 0}private class PrivateSwiftClass1: NSObject { var property1: Int = 0}
在SwiftFile2.swift中建立以下的類
<pre name="code" class="objc">import Foundation@objc public class PublicObjcTypeSwiftClass2: NSObject { var property1: Int = 0 //var ocClass: OCTypeClass = OCTypeClass() //func test() { // ocClass.property1 = 0 //}}@objc class ObjcTypeSwiftClass2: NSObject { var property1: Int = 0}@objc private class ObjcPrivateTypeSwiftClass2: NSObject { var property1: Int = 0}public class PublicSwiftClass2: NSObject { var property1: Int = 0}class SwiftClass2: NSObject { var property1: Int = 0}private class PrivateSwiftClass2: NSObject { var property1: Int = 0}
4. 由於OC檔案定義之後會自己主動產生相應的類。所以無需再次定義了。
#import "OCTypeClass.h"#import "SwiftAndObjective-Swift.h"@implementation OCTypeClass- (void)test{ PublicObjcTypeSwiftClass1 *type = [[PublicObjcTypeSwiftClass1 alloc] init]; type.property1 = 0; ObjcTypeSwiftClass1 *type2 = [[ObjcTypeSwiftClass1 alloc] init]; type2.property1 = 0;}@end
5. 開啟OCTypeClass.m 檔案我們須要引用Swift檔案裡的類。能夠使用“項目project名+ ‘-’ + Swfit.h"的形式引入所以的public的而且被標記為@objc的類(標記成@objc的類,即使不顯示的寫出public標記也會被Objective-C類使用)。以下的詳細的代碼(注意當寫#import “”的使用,眼下版本號碼的Xcode不會自己主動識別須要的Swift的header名字。須要自己手動寫,注意:不要寫錯項目名,假設確認是寫對了,可是又一直報錯能夠去重新整理項目,或者重新啟動,又一次build: Project-》 Clean, Project-》Build,大不了又一次啟動Xcode)。
6. 完畢後能夠通過查看源碼的形式(command + 滑鼠左鍵)的形式查看xcode自己主動產生的Objective-C類。
// Generated by Swift version 1.1 (swift-600.0.54.20)#pragma clang diagnostic push#if defined(__has_include) && __has_include(<swift/objc-prologue.h>)# include <swift/objc-prologue.h>#endif#pragma clang diagnostic ignored "-Wauto-import"#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 !defined(__cplusplus) || __cplusplus < 201103Ltypedef uint_least16_t char16_t;typedef uint_least32_t char32_t;#endiftypedef struct _NSZone NSZone;#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#if defined(__has_feature) && __has_feature(modules)@import ObjectiveC;#endif#pragma clang diagnostic ignored "-Wproperty-attribute-mismatch"#pragma clang diagnostic ignored "-Wduplicate-method-arg"SWIFT_CLASS("_TtC17SwiftAndObjective19ObjcTypeSwiftClass1")@interface ObjcTypeSwiftClass1 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective19ObjcTypeSwiftClass2")@interface ObjcTypeSwiftClass2 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective25PublicObjcTypeSwiftClass1")@interface PublicObjcTypeSwiftClass1 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective25PublicObjcTypeSwiftClass2")@interface PublicObjcTypeSwiftClass2 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective17PublicSwiftClass1")@interface PublicSwiftClass1 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective17PublicSwiftClass2")@interface PublicSwiftClass2 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective11SwiftClass1")@interface SwiftClass1 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@endSWIFT_CLASS("_TtC17SwiftAndObjective11SwiftClass2")@interface SwiftClass2 : NSObject@property (nonatomic) NSInteger property1;- (instancetype)init OBJC_DESIGNATED_INITIALIZER;@end#pragma clang diagnostic pop
7. 以下開始在Swift檔案裡使用Objective-C的類。
a)開啟xcode自己主動為我們產生的SwiftAndObjective-Bridging-Header.h檔案, 匯入暴露給swift的類。
這裡為了方便就使用剛剛定義的類,僅僅是為了示範:
#import "OCTypeClass.h"
b)然後我們什麼都不須要做了,直接在Swfit檔案裡實現吧。
import Foundation@objc public class PublicObjcTypeSwiftClass2: NSObject { var property1: Int = 0 var ocClass: OCTypeClass = OCTypeClass() func test() { ocClass.property1 = 0 }}@objc class ObjcTypeSwiftClass2: NSObject { var property1: Int = 0}@objc private class ObjcPrivateTypeSwiftClass2: NSObject { var property1: Int = 0}public class PublicSwiftClass2: NSObject { var property1: Int = 0}class SwiftClass2: NSObject { var property1: Int = 0}private class PrivateSwiftClass2: NSObject { var property1: Int = 0}
注意:
1. 假設想把一個Swfit類暴露給Objective-C的話須要標識@objc
2. 對於private類型的Swift類,僅僅能在所定義的Swift檔案裡被使用。
3. 在一個Swift檔案裡的類,僅僅能訪問外部Swift檔案裡定義的public類型的類。
差點忽略了最重要的一點:假設有什麼問題或者錯誤,歡迎指正或者交流。
示範範例代碼: 代碼
http://download.csdn.net/detail/liyan223/8070805
Swift和Objective-C混合編程