在同一个工程中是可以同时使用Swift和OC的,但不可以同时出现在同一个文件中。

OC调用Swift相关信息的方法

***.m文件中导入工程名-Swift.h即可。
如工程名为ABC,则在需要使用Swift相关信息的.m文件中#import "ABC-Swift.h"即可。

Swift调用OC相关信息的方法

当在Swift/OC工程中创建OC/Swift文件时,会有提示,如下图

点击Yes,会创建一个工程名-Bridging-Header.h的文件,将Swift使用的相关OC的.h文件导入(#import "****.h")就可以在Swift中使用了。

参照:https://itunes.apple.com/us/book/using-swift-cocoa-objective/id888894773?mt=11

注意点

遇到问题

可能有未解决的问题,如果您有方法解决,请留言:) 无比感谢!

1、Swift继承Objective-C并重载父类方法出现编译异常

父类代码:

@interface SuperClass : NSObject
- (NSArray *) arrayWithString:(NSString *)string
array:(NSArray *)array
dictionary:(NSDictionary *)dictionary
number:(NSNumber *)number;
@end @implementation SuperClass
- (NSArray *) arrayWithString:(NSString *)string
array:(NSArray *)array
dictionary:(NSDictionary *)dictionary
number:(NSNumber *)number
{
return @[];
}
@end

*-Bridging-Header.h文件中导入.h头文件:#import "SuperClass.h"

子类代码:

class SubClass: SuperClass {
override func arrayWithString(string: NSString, array: NSArray, dictionary: NSDictionary, number: NSNumber) -> NSArray {
return ["2"]
}
}

有参数或者有返回的Objective-C方法被swift重载的时候就会有编译异常:

Overriding method with selector '***' has incompatible type '****'

解决方法:
如图

可以在Quick Help中看到方法的参数和返回值的类型
上面子类代码改为如下即可:

class SubClass: SuperClass {
override func arrayWithString(string: String, array: AnyObject[], dictionary: NSDictionary, number: NSNumber) -> AnyObject[] {
return ["2"]
}
}

2、Swift中NSClassFromString方法对Swift的类无作用

代码例子如上

在Swift类中使用

var superC: AnyClass! = NSClassFromString("SuperClass")
println(NSStringFromClass(superC)) // 输出SuperClass
var subC: AnyClass! = NSClassFromString("SubClass")
println(NSStringFromClass(subC)) // 输出nil

暂时解决办法:

var subC: AnyClass! = SubClass.self
println(NSStringFromClass(subC)) // 输出SubClass

解决方法:
在SubClass上增加@objc(SubClass)SubClass类变为:

@objc(SubClass)
class SubClass: SuperClass {...}

3、Swift中以performSelector:开头的方法、IMPNSInvocation已经去掉了,用什么替代?

The performSelector: method and related selector-invoking methods are not imported in Swift because they are inherently unsafe. 摘自

Objective-C中的执行指定对象的指定方法:

但Swift中以performSelector:开头的方法、IMPNSInvocation已经去掉了。。。

Swift的NSInvocationOperation类、NSObjectfunc forwardInvocation(anInvocation: NSInvocation!)都有对NSInvocation的引用,为毛点进去神马都没有呢。。。或许还是因为Xcode6 beta2还是beta版本吧。。。beta3也是如此。。。

那么用什么替代呢?

我目前还是使用Objective-C配合解决这个问题
Xcode6 beta3中的Swift加入了IMP,但和Objective-C中的IMP完全不一样。还不知道怎么用。

4、Swift中AnyObject如何转换为闭包类型?

Swift includes a protocol type named AnyObject that represents
any kind of object, just as id does in Objective-C. The AnyObject
protocol allows you to write type-safe Swift code while maintaining the
flexibility of an untyped object. Because of the additional safety
provided by the AnyObject protocol, Swift imports id as AnyObject.
Swift closures and Objective-C blocks are compatible, so you can pass
Swift closures to Objective-C methods that expect blocks. Swift closures
and functions have the same type, so you can even pass the name of a
Swift function.
摘自
如上所述,Swift中的AnyObject等价于Objective-C中的id,Swift中的闭包等价于Objective-C中的Block。但在实际应用中却有问题,比如Objective-C中id类型可以强制转换为Block,如下:

typedef void(^BasicBlock)(void);
id b1 = ^{
};
BasicBlock b1 = b1;

但Swift中如果强制转换就有error了,如下:

typealias BasicBlock = () -> Void
func a() -> BasicBlock {
func b(){
println("123213");
}
return b;
}
var c:AnyObject = a(); // error

遇到的问题是:Swift通过问题3返回了一个Block(闭包),但其返回出来的是id类型,在Swift中接收到的是AnyObject类型,需要转换成指定的闭包类型,然后执行。

Swift与Objective-C交互的更多相关文章

  1. iOS: 学习笔记, Swift与C指针交互(译)

    Swift与C指针交互 Objective-C和C API经常需要使用指针. 在设计上, Swift数据类型可以自然的与基于指针的Cocoa API一起工作, Swift自动处理几种常用的指针参数. ...

  2. Swift与JS的交互

    Swift与JS的交互 原理 同Object-C与JS交互的大同小异,只是方法形式改变了. 首先我们需要引入iOS7.0出来的JavaScriptCore.framework JavaScriptCo ...

  3. IOS-Swift、Objective-C、C++混合编程

    1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的, ...

  4. iOS - Swift 与 C 语言交互编程

    前言 作为一种可与 Objective-C 相互调用的语言,Swift 也具有一些与 C 语言的类型和特性,如果你的代码有需要,Swift 也提供了和常见的 C 代码结构混合编程的编程方式. 1.基本 ...

  5. Swift与Objective-C中的闭包

    Swift Code: func makeIncrementor(forIncrement amount: Int) -> (() -> Int,() -> Int) { func ...

  6. Swift调用Objective C的FrameWork

    很多Github的库经过很多年的发展,源码都是OC写的,,所以,用Swift调用OC的库就是开发中难免遇到的的一个问题,本文以AFNetworking为例,讲解如何跨语言调用. 第一步 创建一个空的工 ...

  7. Swift和Objective C关于字符串的一个小特性

    一.Unicode的一个小特性 首先,Unicode规定了许多code point,每一个code point表示一个字符.如\u0033表示字符"3",\u864e表示字符&qu ...

  8. iOS开发 - Swift使用JavaScriptCore与JS交互

    一.前言 在这个提倡敏捷开发和H5横行的年代,原生App内嵌入一些H5页面已经成为一种流行的趋势.一套H5页面就可以适配复杂的iOS和Android页面,大量节省了开发和维护时间,如果本来就有移动端网 ...

  9. 孟加拉央行SWIFT攻击事件恶意木马分析(转)

    第一章 分析概述 该恶意木马样本为运行于winodws平台上的PE文件(名称:evtdiag.exe).文件大小为64KB,编译时间是2016年2月5日. 经分析,该样本为定制的攻击SWIFT客户端程 ...

  10. 幼谈苹果新开发语言:Swift和苹果的用心

    今天是个值得纪念的日子:因为苹果的WWDC大会.苹果的每次WWDC(全球开发者大会)举行都让我们像打了肾上腺素这么兴奋.幸福.惊叹.震撼.深思. 今年也不例外,最关键的是苹果带来了它的一门新开发语言: ...

随机推荐

  1. USB2.0的基本学习

    SB2.0是在1.0的基础上于2000年提出来的,在1.0的基础上曾加了480Mbps的数据传输率.USB2.0具有以下的优点: 1.每个USB系统中有一个主机,通过级联的方式连接多个外部设备,最多可 ...

  2. SQL Server带游标的SQL

    DECLARE test_cursor CURSOR FOR SELECT ID FROM dbo.T_BD_Restaurant WHERE id <> '0AAB2E55-79F8-4 ...

  3. Nagios利用NSClient++监控Windows主机

    在Nagios的libexec下有check_nt这个插件,它就是用来检查windows机器的服务的.其功能类似于check_nrpe.不过还需要搭配另外一个软件NSClient++,它则类似于NRP ...

  4. navigationController显示隐藏问题

    今天遇到设置: self.navigationController.navigationBarHidden= YES; 点击返回上一个UIViewController的时候这个时候这个navigati ...

  5. TCP/IP协议族

    1.TCP(传输控制协议)/IP(网际协议)协议族是一个网络通讯模型,以及一整个网络传输协议家族,为互联网的基础通讯架构. TCP/IP四层协议的表示方法: 2.TCP/IP参考模型映射到OSI模型: ...

  6. Cannot create JDBC driver of class '' for connect URL 'jdbc:mysql://127.0.0.1:3306/test'

    原来的配置如下: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http ...

  7. EC读书笔记系列之15:条款32、33、34

    条款32 确保你的public继承塑模出is-a关系 记住: ★public继承意味着is-a.适用于base class身上的每一件事情一定也适用于derived class身上,∵每一个deriv ...

  8. BZOJ 2726: [SDOI2012]任务安排( dp + cdq分治 )

    考虑每批任务对后面任务都有贡献, dp(i) = min( dp(j) + F(i) * (T(i) - T(j) + S) ) (i < j <= N)  F, T均为后缀和. 与j有关 ...

  9. OC语法10——@protocol协议,

    参考资料:博客 @protocol,协议: OC中protocol的含义和Java中接口的含义是一样的,它们的作用都是为了定义一组方法规范. 实现此协议的类里的方法,必须按照此协议里定义的方法规范来. ...

  10. echarts的使用总结;

    题外话:好久没来博客园了,这几个月自己的工作经历可以算是相当丰富,其实一直不知道自己做web前端能做到什么时候,但是想说既然现在还在做着这个职位,就好好的学习.之前很少写js代码,来了新公司大多数都是 ...