MySwiftViewController:UIViewControllerUITableViewDelegateUITableViewDataSource 对于 Swift 定义的类(包括从Objective-C继承的类)总是使用Swift语言的初始化方法进行类的初始化,Swift自动转换Objective-C 的初始化方法为Swift中的初始化方法。
1.6 与Objective-C的兼容
当定义一个Swift类派生自NSObject或其它的Objective-C类时,Swift类自动与Objective-C兼容,Objective-C代码可以直接使用它。
注意在Objective-C中不能定义一个继承Swift类的子类。
如果Swift类不派生自Objective-C类,则Objective-C代码不能直接使用它,如果要使该Swift类能够被Objective-C代码使用,需要使用@objc来标识它。
当在Objective-C代码中使用一个Swift API 时,编译器自动执行一个直接转换操作。Swift 的API 被转换为Objective-C的形式。
如Swift 中的一个函数func playSong(name: String)被转换为Objective-C语言的如下形式- (void)playSong:(NSString *)name。
Swift 的一个初始化方法init (songName: String,artist: String)被转换为Objective-C语言的如下形式:
- (instancetype)initWithSongName:(NSString *)songName artist:(NSString *)artist。
在 Swift中,也能使用@objc对类、属性、方法规定一个能够被Objective-C语言识别和使用的另外的名字。如下所示:
@objc(Squirrel)
classБелка{
(initWithName:)
init(имя:String) {/*...*/}
(hideNuts:inTreefuncпрячьОрехи(Int,вДереве:Дерево) {/*...*/}
}
1.7、 与Cocoa数据类型的桥接
Swift能够自动在一些Objective-C 和Swift类型之间相互转换,另外也有一些类型,能够在Swift和Objective-C 之间相互替换使用。可转换或可替换的类型被称作可桥接类型。如Swift 语言中的Array类型和Objective-C 中的NSArray类,Swift 中的String类型与Objective-C 中的NSString类,Swift 的Dictionary类型与Objective-C 中的NSDictionary类,都是可桥接类型。
在Swift中,使用NSString的任何地方都能用String代替,并能同时使用两种类型提供的功能,如可以在Swift的String类型上调用NSString提供的capitalizedString方法。
为了在Swift中允许和使用桥功能,只需输入Foundation框架。如下所示:
importFoundation
greeting="hello,world!"
capitalizedGreeting=greeting.capitalizedString
// capitalizedGreeting: String = Hello,World!
还能够像创建String一样创建一个NSString对象,如下所示创建了一个NSString类型的对象:
Foundation
myStringNSString"123"
ifintegerValue= (myStringasString).toInt() {
println("(myString)is the integer(integerValue)
}
Swift也自动在Int、Float、UInt、Double、Bool类型与NSNumber类型之间实现类型的桥接,因此可以使用Int、Float、UInt、Double、Bool类型来创建一个NSNumber对象。在需要的NSNumber类型参数的地方也可以传送一个Int、Float、UInt、Double、Bool类型的参数。
letn=42
m:NSNumber=n
注: Cocoa 的NSNumber类型与NSUInteger类型都被桥接为Swift的Int类型。
当从一个NSArray对象桥接为一个Swift Array数组时,NSArray数组的类型需要与AnyObject兼容,结果数组的类型为AnyObject[]。由于所有的Objective-C对象与AnyObject类型兼容,因此任何类型的NSArray对象都能被桥接为Swift数组。
同样,如果Swift数组中的元素与AnyObject兼容,一个Swift数组也能桥接为NSArray对象,否则将会出运行时错误。
同样也能像创建一个Swift数组一样创建一个NSArray对象。
schoolSuppliesNSArray= ["Pencil""Eraser""Notebook"]
// schoolSupplies is an NSArray object containing NSString objects
二、与 C API的交互
2.1、 C语言基本类型
Swift提供了与C语言基本类型对等的类型。但除非特别需要,不推荐使用。
C Type Swift Type
bool CBool
char,signed char CChar
unsigned char CUnsignedChar
short CShort
unsigned short CUnsignedShort
int CInt
unsigned int CUnsignedInt
long CLong
unsigned long CUnsignedLong
long long CLongLong
unsigned long long CUnsignedLongLong
wchar_t CWideChar
char16_t CChar16
char32_t CChar32
float CFloat
double CDouble
2.2 C-style类型的枚举
在Objective-C 语言中用NS_ENUM宏标记的C-style类型的枚举或用NS_OPTIONS标记的选项在导入Swift时被自动转换为Swift形式的枚举。
OBJECTIVE-C
typedefNS_ENUM(NSIntegerUITableViewCellStyle) {
UITableViewCellStyleDefaultUITableViewCellStyleValue1UITableViewCellStyleValue2UITableViewCellStyleSubtitle
};
被转换为如下的Swift枚举形式。
SWIFT
enumUITableViewCellStyleIntcaseDefault
Value1
Value2
caseSubtitle
}
2.3 指针
Swift避免直接使用指针,可是当需要时也提供了几种类型的指针供直接存取内存使用。
对于作为参数的指针,有如下映射关系:
C Syntax Swift Syntax
const void * CConstVoidPointer
void * CMutableVoidPointer
const Type * CConstPointer<Type>
Type * CMutablePointer<Type>
对于作为返回类型、变量和参数类型的指针,有如下映射关系:
void * COpaquePointer
Type * UnsafePointer<Type>
对于类的指针,有如下映射关系:
Type * const * CConstPointer<Type>
Type * __strong * CMutablePointer<Type>
Type ** AutoreleasingUnsafePointer<Type>
以上的Type是一个占位类型,可以代表任意类型。
2.4 宏定义和条件编译
C语言使用#define定义的基本常量在导入Swift时被Swift编译器自动转换为Swift 语言的全局变量。但复杂的宏定义不能被Swift转换。
Swift代码也支持条件编译,如下所示:
#ifbuild configuration && !build configuration
statements
#elseifbuild configuration
statements
#else
#endif
三、 与Interface Builder集成
在Swift也是使用@IBOutlet@IBAction来定义Outlets属性和Actions动作,用来实现代码与用户接口对象的连接。如下所示,在MyViewController类中声明了与用户接口对象连接的一个outlet属性、一个outlet属性数组、一个action动作。
MyViewController{
@IBOutletvarbuttonUIButton
@IBOutlettextFields:UITextField[]
@IBActionfuncbuttonTapped(AnyObject) {
println("button tapped!")
}
}
当使用@IBOutlet来声明一个outlet时,Swift自动把它转换为一个弱引用隐含型的已展开选项类型,并分配它的初始值为nil。
Swift中使用@IBDesignable属性来声明一个能够在Interface Builder中使用的特定视图对象,使用@IBInspectable属性声明一个可以在Interface Builder中的inspector中进行编辑的视图属性。如下所示声明了一个视图和相关的属性:
@IBDesignable
MyCustomViewUIView @IBInspectabletextColorUIColor
iconHeightCGFloat
/* ... */
}
四、 混合使用Swift与Objective-C语言
在一个单独的工程中,还能够同时包含Objective-C和Swif文件。
为了使一组Objective-C文件被相同应用工程中的Swif文件使用,需要使用Xcode创建一个Objective-C桥接头文件,并在桥接头文件中导入每一个被Swift用到的Objective-C头文件。桥接头文件的名字为产品名字加“-Bridging-Header.h”后缀。
OBJECTIVE-C头文件
#import "XYZCustomCell.h"
#import "XYZCustomView.h"
#import “XYZCustomViewController.h"
Objective-C桥接头文件中添加的Objective-C头文件中定义的功能将能够自动被相同工程的Swift文件使用。
Objective-C代码需要使用相同应用工程中的Swift代码时,Xcode自动产生一个包含相同工程中所有Swift文件接口声明的Objective-C 头文件,接口文头件为产品模块名字加“-Swift.h”后缀。
然后在要使用Swift代码的Objective-C文件中采用如下形式导入该头文件。
#import “ProductModuleName-Swift.h”
然后该Objective-C文件将可使用相同工程中的所有Swift文件中公开的功能。
为了在一个Objective-C头文件中引用一个Swift类,需要使用@class在引用前面对该类进行声明。如下所示:
OBJECTIVE-C
// MyObjcClass.h
@classMySwiftClass;
@interfaceMyObjcClass:NSObject
- (MySwiftClass*)return SwiftObject;
/* ... */
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!