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

0、导入头文件。

oc类使用swift类,必须导入头文件appname-swift.h,该文件不可见,但可以点进去。swift调用oc类,必须在文件appNme-Bridging-Header.h中导入oc类的头文件。

1、swift类可以继承oc类,oc类不能继承swift类(即使该swift类的父类是oc类也不行)。

如,创建一个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

创建一个继承于NSObject的swift类:

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

创建一个没有父类的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)
    }

}

创建一个继承于OCObj的swift类:

class SwiftTestClass: OCObj {
    //swift类可以继承oc类,oc不能继承swift类
}

如果强行创建一个oc类继承于swift类:

//swift类可以继承oc类,oc不能继承swift类。如果直接创建oc文件,可以选择swift类作为父类,但创建后会报错。
//@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中没有宏,可以使用全局常量、全局函数代替部分宏。

swift中是不能使用宏定义语法,但是因为命名空间的缘故,在其中,我们将原本oc中不需要接受参数的宏,定义成let常量或枚举,将需要接受参数的宏定义成函数。
⚠️横屏后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

定义成枚举、全局函数举例:

//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

比较蹩脚的解决办法:
创建OC类,类中定义个方法,然后在swift的调用这个方法。
(注:swift中与NS_OPTIONS相似的是struck实现 OptionSet 协议。)

6、oc使用swift定义的协议

//如果要在oc中使用swift定义的协议,则需要加上@objc,且如果是不必实现的函数,函数前要加上 @objc optional。
如:

@objc protocol AlertViewProtocol {
    func didSelect(_ row: Int) //必须实现的协议
    @objc optional func onPickerCancel() //不必实现的协议
    @objc optional func showed()
}

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

1、元组:对于oc可能用到的:方法,返回不能是元组,参数能不能是元组。属性不能是元组。
2、范型(Generics)范型
3、Swift 中定义的结构体(Structures defined in Swift)不能在oc中使用,OC中必须继承nsobj
4、Swift 中定义的顶层函数(Top-level functions defined in Swift)
5、Swift 中定义的全局变量(Global variables defined in Swift)
6、Swift 中定义的类型别名(Typealiases defined in Swift)
7、Swift风格可变参数(Swift-style variadics)
8、嵌套类型(Nested types)
9、柯里化函数(Curried functions)

8、单例

swift创建单例比较方便、安全。
在swift写的模块中,Manager单例的代码如下

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

但这样写在oc模块中不能获取单例.
可以添加一个供oc调用的函数

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

oc中使用

Manager *training = [Manager sharedInstance];

(如有错误欢迎斧正)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 2,256评论 1 6
  • importUIKit classViewController:UITabBarController{ enumD...
    明哥_Young阅读 3,784评论 1 10
  • Swift 介绍 简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 ...
    大L君阅读 3,201评论 3 25
  • 一直没有时间好好看一下swift,最近复习了一遍语法,这里记录swift学习过程中遇到的一些问题和要点,和Obje...
    bomo阅读 2,339评论 0 25
  • 家里的房子终于要装修了。但是,却让我和老妈之前开始了各种较量。 首先,她让我去给墙面淋水,好让工人粉刷;然后,她叫...
    林间风月阅读 428评论 0 2