swift&oc混編的一些限制整理

0算芯、導(dǎo)入頭文件柒昏。

oc類使用swift類,必須導(dǎo)入頭文件appname-swift.h熙揍,該文件不可見职祷,但可以點(diǎn)進(jìn)去。swift調(diào)用oc類届囚,必須在文件appNme-Bridging-Header.h中導(dǎo)入oc類的頭文件有梆。

1、swift類可以繼承oc類意系,oc類不能繼承swift類(即使該swift類的父類是oc類也不行)泥耀。

如,創(chuàng)建一個oc類OCObj
OCObj.h:

#import <Foundation/Foundation.h>
@class SubOfNSObj;
@class NotSubNSObj; //HB2-Swift.h里沒有

@interface OCObj : NSObject

//@property (nonatomic, copy) NSString * _Nullable name;
@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString * _Nullable name2;

@end

OCObj.m

#import "OCObj.h"

@implementation OCObj

@end

創(chuàng)建一個繼承于NSObject的swift類:

class SubOfNSObj: NSObject {
    let name: String
    let age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

創(chuàng)建一個沒有父類的swift類:

class NotSubNSObj {
    
    let name: String
    let age: Int
    
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
    //swift可以使用oc的類
    func testOCObj() {
        let ocObj = OCObj()
        ocObj.name = "張三"
        
        let name1: String = ocObj.name
        let name2: String = ocObj.name2!
        print(name1)
        print(name2)
    }

}

創(chuàng)建一個繼承于OCObj的swift類:

class SwiftTestClass: OCObj {
    //swift類可以繼承oc類蛔添,oc不能繼承swift類
}

如果強(qiáng)行創(chuàng)建一個oc類繼承于swift類:

//swift類可以繼承oc類痰催,oc不能繼承swift類。如果直接創(chuàng)建oc文件迎瞧,可以選擇swift類作為父類夸溶,但創(chuàng)建后會報錯。
//@interface OCObjTestSubSwift : SubOfNSObj
////錯誤:Attempting to use the forward class ......
//@end

2凶硅、oc類在使用swift類時缝裁,該swift類必須繼承于oc類。

如足绅,在oc類ViewController中使用時:

- (void)test
{
    SubOfNSObj *obj1 = [[SubOfNSObj alloc] initWithName:@"lisi" age:4];
    NSLog(@"%@", obj1.name);
    //沒有繼承nsobject的swift類不能在oc中使用
//    NotSubNSObj *obj1 = [NotSubNSObj new];//use of undeclaerd identifier 'NotSubNSObj'
}

3捷绑、swift中沒有宏,可以使用全局常量氢妈、全局函數(shù)代替部分宏粹污。

swift中是不能使用宏定義語法,但是因為命名空間的緣故允懂,在其中厕怜,我們將原本oc中不需要接受參數(shù)的宏衩匣,定義成let常量或枚舉蕾总,將需要接受參數(shù)的宏定義成函數(shù)。
??橫屏后kScreenHeight及kScreenWidth是不會變化的琅捏,因為是常量生百,只會賦值一次。OC中則會實時變化柄延,因為不是賦值蚀浆,是宏替換缀程。
?? 這里定義的常量oc中并不能使用,可以定義一個類市俊,然后將所有的全局變量和常量改成這個類的屬性杨凑。
如oc中常用的幾個宏:

 #define kIOS7   [UIDevice currentDevice].systemVersion.doubleValue>=7.0 ? 1 :0
 #define kIOS8   [UIDevice currentDevice].systemVersion.doubleValue>=8.0 ? 1 :0
 #define kScreenHeight     [UIScreen mainScreen].bounds.size.height
 #define kScreenWidth      [UIScreen mainScreen].bounds.size.width

在swift中定義為全局常量:

let kIOS7 = Double(UIDevice().systemVersion)! >= 7.0 ? 1 : 0
let kIOS8 = Double(UIDevice().systemVersion)! >= 8.0 ? 1 : 0
let kSCREEN_HEIGHT = UIScreen.main.bounds.height
let kSCREEN_WIDTH = UIScreen.main.bounds.width

定義成枚舉、全局函數(shù)舉例:

//MARK:時間格式:
enum TimeFormat: String {
    case common = "yyy-MM-dd HH:mm:ss"
    case yyMdHm = "yy-MM-dd HH:mm"
}
/MARK:沙盒路徑
//Documnets目錄
func pathForDocument() -> String {
    let ducumentPath = NSHomeDirectory() + "/Documents"
    return ducumentPath
}

使用:

let timeFormatStr = TimeFormat.yyMdHm.rawValue
let formatter = DateFormatter();
formatter.dateFormat = timeFormatSt
let timeStr = formatter.string(from: Date())
print(timeStr)

let path = pathForDocument()
print(path)

4摆昧、swift枚舉類型在oc中使用

如果需要在oc類中使用時只能使用帶@objc的枚舉撩满,帶@objc的枚舉必須時Int類型,否則會報錯。

enum Direction {
    case Up
    case Down
    case Left
    case Right
}

enum Direction2: Int {
    case Up2
    case Down2
    case Left2
    case Right

@objc enum Direction3: Int {
    case Up3
    case Down3
    case Left3
    case Right3
}

以上三個枚舉绅你,只有Direction3能在oc類中使用, Direction伺帘、Direction2都不能在oc類中使用。

5忌锯、swift中使用oc的NS_OPTIONS類型枚舉

swift中沒有“|”伪嫁,
如,下面寫法是錯誤的

let options : NSStringDrawingOptions = .UsesLineFragmentOrigin | .UsesFontLeading

比較蹩腳的解決辦法:
創(chuàng)建OC類偶垮,類中定義個方法张咳,然后在swift的調(diào)用這個方法。
(注:swift中與NS_OPTIONS相似的是struck實現(xiàn) OptionSet 協(xié)議似舵。)

6晶伦、oc使用swift定義的協(xié)議

//如果要在oc中使用swift定義的協(xié)議,則需要加上@objc,且如果是不必實現(xiàn)的函數(shù)啄枕,函數(shù)前要加上 @objc optional婚陪。
如:

@objc protocol AlertViewProtocol {
    func didSelect(_ row: Int) //必須實現(xiàn)的協(xié)議
    @objc optional func onPickerCancel() //不必實現(xiàn)的協(xié)議
    @objc optional func showed()
}

7、其他swift中有而oc中沒有的

1频祝、元組:對于oc可能用到的:方法泌参,返回不能是元組,參數(shù)能不能是元組常空。屬性不能是元組沽一。
2、范型(Generics)范型
3漓糙、Swift 中定義的結(jié)構(gòu)體(Structures defined in Swift)不能在oc中使用,OC中必須繼承nsobj
4铣缠、Swift 中定義的頂層函數(shù)(Top-level functions defined in Swift)
5、Swift 中定義的全局變量(Global variables defined in Swift)
6昆禽、Swift 中定義的類型別名(Typealiases defined in Swift)
7蝗蛙、Swift風(fēng)格可變參數(shù)(Swift-style variadics)
8、嵌套類型(Nested types)
9醉鳖、柯里化函數(shù)(Curried functions)

8捡硅、單例

swift創(chuàng)建單例比較方便、安全盗棵。
在swift寫的模塊中壮韭,Manager單例的代碼如下

@objc public class Manager: NSObject {
    public static let shared = Manager()
}

但這樣寫在oc模塊中不能獲取單例.
可以添加一個供oc調(diào)用的函數(shù)

@objc public class Manager: NSObject {
    public static let shared = Manager()
    
    @objc public static func sharedInstance() -> Manager {
        return shared
    }
}

oc中使用

Manager *training = [Manager sharedInstance];

(如有錯誤歡迎斧正)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末北发,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子喷屋,更是在濱河造成了極大的恐慌琳拨,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屯曹,死亡現(xiàn)場離奇詭異从绘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)是牢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門僵井,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人驳棱,你說我怎么就攤上這事批什。” “怎么了社搅?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵驻债,是天一觀的道長。 經(jīng)常有香客問我形葬,道長合呐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任笙以,我火速辦了婚禮淌实,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘猖腕。我一直安慰自己拆祈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布倘感。 她就那樣靜靜地躺著放坏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪老玛。 梳的紋絲不亂的頭發(fā)上淤年,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機(jī)與錄音蜡豹,去河邊找鬼麸粮。 笑死,一個胖子當(dāng)著我的面吹牛余素,可吹牛的內(nèi)容都是我干的豹休。 我是一名探鬼主播炊昆,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼桨吊,長吁一口氣:“原來是場噩夢啊……” “哼威根!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起视乐,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤洛搀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后佑淀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體留美,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年伸刃,在試婚紗的時候發(fā)現(xiàn)自己被綠了谎砾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡捧颅,死狀恐怖景图,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碉哑,我是刑警寧澤挚币,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站扣典,受9級特大地震影響妆毕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贮尖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一笛粘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧湿硝,春花似錦闰蛔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蚤吹,卻和暖如春例诀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背裁着。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工繁涂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人二驰。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓扔罪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桶雀。 傳聞我的和親對象是個殘疾皇子矿酵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容