转载:swift3.0和Objective-C的交互需要注意这些
章,作者:ZeroJ(Gitbub)
Swift3.0出来后,可以看到改变很大,和cocoa,Foundation...的交互也变得更方便了,同时Swift编写的应用适配到iOS 7,所以,我们可以相信: 在未来使用swift的情况会逐渐增加了,同时会涉及到OC和Swift在项目中并存的情况,这里我重新读了官方的'Using swift with Cocoa and Objective-C(swift3)'的文档,记录了一些个人觉得比较常用的笔记,请大家选择性阅读(里面的代码 均来自文档)
-
OC的初始化方法在Swift中被引为
1
2
3
|
init(...)---如果初始化不会失败
init?(...)---如果初始化可能失败
init!(...)---否则
|
-
oc中的property里的(getter==,setter==)将会被swift忽略
-
id对应Anyobject 但是所有的Anyobject在swift中是可选值,如果之前的值为可选值,在被设置为Anyobject后就是多重可选值了
-
oc中的轻量级泛型也是对应与swift中的泛型
@propertyNSArray*dates
对应于
var
dates:[Date]
|
-
swift 中的闭包默认捕获变量的方式相当于 oc中block中捕获被标记为 __block的变量方式 -> 就是说 闭包捕获到的是变量的指针
-
swift中只要不是在多线程中,建议使用[unowned self]来避免循环引用,多线程中,建议使用[weak self]
-
== 操作符相当于oc中的isEqual: --- 即比较内容是否相等;=== 相当于oc中的指针比较
-
不能在oc中继承swift的class
-
当需要使用 KVO 或者 runtime的时候需要这样处理
-
当使用oc的 perform(selector,with:)方法的时候会返回一个可选值(指向AnyObject的指针);但是使用perform(:on:with:waitUntilDone:modes:) and perform(:with:afterDelay:)不会返回可选值
-
使用 #keyPath() 可以转换为string,#keyPath(class.property) == "property"
-
可用于KVC 例如person.value(forKey: #keyPath(Person.name)) = person.name
-
NSClassFromString("MyFramework.MyClass")
-
@IBDesignable 用在class(UIView的子类)声明的前面,然后就可以在storyBoard中的inspector编辑它;@IBInspectable 用在(UIView的子类)的属性前面,然后就可以在storyBoard中的inspector编辑它,就想系统提供的可以设置颜色,字体...
-
oc中的 copy属性 转换为swift中的@NSCopying 必须遵守NSCoding协议
-
文档中指出"The corresponding reference types can be accessed with their original NS class name prefix."但是beta版本中不能很好的使用NS开头的
-
在oc和swift的桥接类型之间 直接使用 as 可以相互转换
-
因为swift中的String和NSString使用的编码方式不一样,所以在swift中要对string使用索引的时候 不能直接使用 Int 或者NSRange
-
需要使用String.Index and Range
-
swift会将Double,Int,Bool,Uint,Float和NSNumber桥接,所以可以直接将
-
这些类型的值使用 as NSNumber转换为NSNumber,但是逆向进行是得到的可选值 as?
-
Foundation 和Core Foundation 之间的类型有toll-free bridge('免费桥')
-
Foundation中的常量,在swift中被换为类嵌套的枚举:NSJSONReadingOptions ----- >> JSONSerialization.ReadingOption
-
swift中使用 Core Foundation
-
如果使用swift处理过的函数不用我们手动管理内存分配;否则需要我们处理
-
区分的方式: 当返回值是 Unmanaged的时候说明需要我们处理
-
处理方法: 在使用返回的值之前调用他对应的takeUnretainedValue() 或takeRetainedValue()即可
-
例如let memoryManagedResult = StringByAddingTwoStrings(str1,str2).takeUnretainedValue()
-
swift中Core Foundation里的类型 Ref后缀被去掉了 例如 CFTypeRef -> CFType
-
在oc的方法 使用 NS_SWIFT_NOTHROW,将不会使用swift的异常抛出机制
-
swift中直接使用 is 来实现oc中isKindOfClass: 的功能
-
swift 中的单例很简单:
或者
staticletsharedInstance:Singleton={
letinstance=Singleton()
//setupcode
return
instance
}()
}
|
eg:
ColorColorCreateWithCMYK(floatc,floatm,floaty,floatk)CF_SWIFT_NAME(Color.init(c:m:y:k:)); |
对应为swift中
typedefNS_ENUM(NSInteger,UITableViewCellStyle){
UITableViewCellStyleDefault,
UITableViewCellStyleValue1,
UITableViewCellStyleValue2,
UITableViewCellStyleSubtitle
};
//对应与
enumUITableViewCellStyle:Int{
case
`
default
`
value1
value2
subtitle
}
typedefenum{
MessageDispositionUnread=0,
MessageDispositionRead=1,
MessageDispositionDeleted=-1,
}MessageDisposition;
|
对应与
structMessageDisposition:RawRepresentable,Equatable{}
MessageDispositionUnread:MessageDisposition{get}
MessageDispositionRead:MessageDisposition{get}
MessageDispositionDeleted:MessageDisposition{get}
|
c中的被NS_OPTIONS修饰的枚举,在swift中是OptionSet类型,-> 即可以使用数组方式选多个值
typedefNS_OPTIONS(NSUInteger,UIViewAutoresizing){
UIViewAutoresizingNone=0,monospace!important; font-size:1em!important; min-height:inherit!important">UIViewAutoresizingFlexibleLeftMargin=1<<0,monospace!important; font-size:1em!important; min-height:inherit!important">UIViewAutoresizingFlexibleWidth=1<<1,monospace!important; font-size:1em!important; min-height:inherit!important">UIViewAutoresizingFlexibleRightMargin=1<<2,
UIViewAutoresizingFlexibleTopMargin=1<<3,
UIViewAutoresizingFlexibleHeight=1<<4,
UIViewAutoresizingFlexibleBottomMargin=1<<5
};
|
#ifarch(arm)||arch(arm64)
#ifswift(>=3.0)
print(
"UsingSwift3ARMcode"
)
#else
"UsingSwift2.2ARMcode"
)
#endif
#elseifarch(x86_64)
print("Using64-bitx86code.)
#else
"Usinggeneralcode."
)
#endif
|
-
swift中使用指针的方式
-
使用inout方式 &变量
-
使用UnsafePointer或者UnsafeMutablePointer
例如这个函数接受的参数可以传许多种
letx:Float=0
functakesAPointer(_p:UnsafePointer!){
//...
}
takesAPointer(&x)
takesAPointer([0.0,1.0])
|