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];
(如有錯誤歡迎斧正)