Swift与Objective-C交互
在同一个工程中是可以同时使用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并重载父类方法出现编译异常
- 2、Swift中
NSClassFromString
方法对Swift的类无作用 - 3、Swift中以
performSelector:
开头的方法、IMP
、NSInvocation
已经去掉了,用什么替代? - 4、Swift中
AnyObject
如何转换为闭包
类型?
可能有未解决的问题,如果您有方法解决,请留言:) 无比感谢!
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:
开头的方法、IMP
、NSInvocation
已经去掉了,用什么替代?
The performSelector: method and related selector-invoking methods are not imported in Swift because they are inherently unsafe. 摘自
Objective-C中的执行指定对象的指定方法:
- 使用以
performSelector:
开头的方法; - 使用
IMP
; - 使用
NSMethodSignature
及NSInvocation
,见Object-C中使用NSInvocation在Runtime时调用方法时传入多个参数的方法
但Swift中以performSelector:
开头的方法、IMP
、NSInvocation
已经去掉了。。。
Swift的NSInvocationOperation
类、NSObject
的func 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交互的更多相关文章
- iOS: 学习笔记, Swift与C指针交互(译)
Swift与C指针交互 Objective-C和C API经常需要使用指针. 在设计上, Swift数据类型可以自然的与基于指针的Cocoa API一起工作, Swift自动处理几种常用的指针参数. ...
- Swift与JS的交互
Swift与JS的交互 原理 同Object-C与JS交互的大同小异,只是方法形式改变了. 首先我们需要引入iOS7.0出来的JavaScriptCore.framework JavaScriptCo ...
- IOS-Swift、Objective-C、C++混合编程
1.Objective-C调用C++代码 后缀为m文件的是Objective-C的执行文件,而后缀为mm文件的是Objective-C++文件. 直接在Objective-C中是无法调用C++代码的, ...
- iOS - Swift 与 C 语言交互编程
前言 作为一种可与 Objective-C 相互调用的语言,Swift 也具有一些与 C 语言的类型和特性,如果你的代码有需要,Swift 也提供了和常见的 C 代码结构混合编程的编程方式. 1.基本 ...
- Swift与Objective-C中的闭包
Swift Code: func makeIncrementor(forIncrement amount: Int) -> (() -> Int,() -> Int) { func ...
- Swift调用Objective C的FrameWork
很多Github的库经过很多年的发展,源码都是OC写的,,所以,用Swift调用OC的库就是开发中难免遇到的的一个问题,本文以AFNetworking为例,讲解如何跨语言调用. 第一步 创建一个空的工 ...
- Swift和Objective C关于字符串的一个小特性
一.Unicode的一个小特性 首先,Unicode规定了许多code point,每一个code point表示一个字符.如\u0033表示字符"3",\u864e表示字符&qu ...
- iOS开发 - Swift使用JavaScriptCore与JS交互
一.前言 在这个提倡敏捷开发和H5横行的年代,原生App内嵌入一些H5页面已经成为一种流行的趋势.一套H5页面就可以适配复杂的iOS和Android页面,大量节省了开发和维护时间,如果本来就有移动端网 ...
- 孟加拉央行SWIFT攻击事件恶意木马分析(转)
第一章 分析概述 该恶意木马样本为运行于winodws平台上的PE文件(名称:evtdiag.exe).文件大小为64KB,编译时间是2016年2月5日. 经分析,该样本为定制的攻击SWIFT客户端程 ...
- 幼谈苹果新开发语言:Swift和苹果的用心
今天是个值得纪念的日子:因为苹果的WWDC大会.苹果的每次WWDC(全球开发者大会)举行都让我们像打了肾上腺素这么兴奋.幸福.惊叹.震撼.深思. 今年也不例外,最关键的是苹果带来了它的一门新开发语言: ...
随机推荐
- opennebula extend(expending) auth module ldap
LDAP Authentication addon permits users to have the same credentials as in LDAP, so effectively cent ...
- iOS 开发的几种手势
今天为大家介绍一下IOS 的七种手势,手势在开发中经常用到,所以就简单 通俗易懂的说下, 话不多说,直接看代码: // 初始化一个UIimageView UIImageView *imageView ...
- 服务管理——ntp
一 ntp相关知识 什么是时间同步服务器 Network Time Protocol(NTP)是用来使计算机时间同步化的一种协议,它可以使计算机对其服务器或时钟源(如石英钟,GPS等等)做同步化,它可 ...
- 配置启动挂载:fstab文件具体解释
fstab文件介绍 fstab文件包括了你的电脑上的存储设备及其文件系统的信息.它是决定一个硬盘(分区)被如何使用或者说整合到整个系统中的文件. 详细来说:用fstab能够自己主动挂载各种文件系统格式 ...
- jQuery+PHP实现的砸金蛋中奖程序
准备 我们需要准备道具(素材),即相关图片,包括金蛋图片.蛋砸碎后的图片.砸碎后的碎花图片.以及锤子图片. HTML 我们页面上要展现的是一个砸金蛋的台子,台上放了编号为1,2,3的三个金蛋,以及一把 ...
- python单/双下划线使用
在Python编程中经常会遇到函数(function),方法(method)及属性(attribute)以下划线'_'作为前缀,这里做个总结. 主要存在四种情形: 1. object # public ...
- C# in Depth阅读笔记2:C#2特性
1.方法组转换 c#2支持一个从方法组到兼容委托类型的隐式转换,即如: button.click+=new eventhandler(logevent)可以写成 button.click+=logev ...
- 前端新人学习笔记-------html/css/js基础知识点(三)
这断时间家里有点事,上班也有点任务,所以几天没看视频没来更新了.今天来更新一下了. 一:默认样式重置 但凡是浏览默认的样式,都不要使用. body,p,h1,h2,h3,h4,h5,h6,dl,dd{ ...
- Lua中强大的元方法__index详解
今天要来介绍比较好玩的内容:__index元方法 我是备胎,记得回头看看 咳咳,相信每一位女生都拥有或者不知不觉中拥有了一些备胎,啊!当然,又或许是成为过别人的备胎. 没有备胎的人,就不是完整的人生. ...
- 浅谈树链剖分(C++、算法、树结构)
关于数链剖分我在网上看到的有几个比较好的讲解,本篇主要是对AC代码的注释(感谢各位witer的提供) 这是讲解 http://www.cnblogs.com/kuangbin/archive/2013 ...