swift开发常用技巧

来源:互联网 发布:微艾薇h5建站 编辑:程序博客网 时间:2024/05/16 12:49

一、swift新元素

 

1、柯里化

可以把接受多个参数的方法变换成接受第一个参数的方法,并且返回接受余下参数、返回结果的新方法

funcaddTwoNumbers(a:Int)(num:Int) -> Int {

return a + num

}

letaddToFour = addTwoNumbers(4)

letresult = addToFour(num:6)

 

2、多元组

在写库的时候可以考虑直接返回一个带有NSError的元组,而不是将Error的指针当作参数传入

 

3@autoclosure

把一句表达式自动的封装成一个闭包

??:当左侧为非nil的Optional值时返回其value,否则返回右侧的值

 

4、操作符

如果新建一个不存在的操作符,需要先使用infix等定义这个操作符

 

5func的参数修饰

func内的参数默认是使用let来修饰的,即不可改变的,若要改变形参的值需使用var来定义参数

 

6typealias

对已存在的类型重命名,类似DEFINE

 

7、可变参数

若函数参数个数不定,可使用来表示可变参数,如

funcsum(input: Int…) -> Int {}

 

8、初始化方法顺序

一般来说,子类的初始化顺序是:

1、设置子类自己需要初始化的参数

2、调用父类的相应的初始化方法

3、对父类中的需要改变的成员进行设定

 

9designatedconveniencerequired关键字的初始化方法差异

#TODO

 

10..<

表示闭合区间,..<则是前闭后开区间

他们是泛型操作符,不止可以作用于整形,还可以作用于String,如"a"…"z"

 

11AnyClass、元类型和.self

AnyClass为元类型,被如下定义:

TypealiasAnyClass = AnyObject.Type

A.Type代表A这个类的类型表示

而如果要取得A的实际类型则要用A.self

let typeA:A.Type = A.self

 

12、接口和类方法中的Self

这里的SelfS是大写的,指的是类本身的类型,而非类具体的实例

 

13、属性观察、监视

didset、willset

 

14final关键字

可用于class、func、var前面进行修饰,表示不允许对该内容进行继承或者重写

 

15lazy关键字

lazy关键字用来声明一个延时加载的变量,使用时只能生命属性是变量并显式的指明类型,还要给出一个对变量进行赋值的语句用来在首次访问属性时运行

lazy varstr: String = {return 'abc'}()

 

16find方法

find方法用来查找对象,如find(arr, 2)查找2在数组arr中的位置

 

17ReflectionMirrorType

#TODO反射和镜像

 

18、多重optional

optional类型可以作为任何类型的容器,包括它自己,即允许Optional<Optional<String>>,Optional容器允许装入的类型有nil、已知类型和Optional自己

 

19map方法

array类型包含了map方法,即可通过map中定义的函数来实现数组到另一个数组的映射,这个方法同样存在于Optional类型中,即可对任何Optional对象进行函数变换

 

二、从Objective-Cswift

 

20、实例方法的动态调用

swift的实例方法有类似python中实例方法的调用方式,可以通过Class.func(Object)(args)的方式来动态调用

 

21、单例

用struct来存储类型变量,出现sharedInstance

 

22、条件编译

#if<condition>

#elseif<condition>

#else

#endif

 

23、编译标记

// MARK:xxx

名称将显示在导航栏中便于快速定位

 

24@objcdynamic

Objective-c中引用swift

protocol中定义可选接口时需要在接口前加上@objc前缀

 

25weak

使用weak关键字定义变量,向编译器表明不希望持有该变量,可防止循环引用

若类中存在闭包引用了self属性,则应使用[weak self] in以防止闭包和对象本身循环应用

 

26autoreleasepool

#TODO

 

27、值类型和引用类型

内置数据类型几乎都是值类型,包括Array和Dictionary

 

28Foundation框架

通过导入Foundation框架后,swift的类型和Foundation的类型自动相互转换,及String和NSString、Array和NSArray等

 

29unsafepointer

指针的swift转换

C指针内存管理

#TODO

 

30GCD

#TODO

 

31、获取对象的类型

可通过.dynamicType来获取对象的类型

 

32、类型判断

if (obj_a isclassA) {}

 

33、类型转换

在as后面加一个?可以在类型转换失败时返回一个nil

 

34、判等
==:值判断,可重载Equatable方法来实现

===:引用判断

 

35、哈希

重载Hashable方法可实现类型的哈希支持

 

36、调用C动态库

swift本身无法直接调用C库,蛋objective-c可以,所以可通过先bridging-header,然后通过objective-c来引用C库

 

37、输出格式化

由于swift没有例如%2f这种的格式化字符,所以只能先通过String的format方法对字符进行格式化,然后println出来

 

38、性能提升

应在swift的性能敏感或关键代码部分,尽量避免使用objective-c或NSObject的子类,保持在swift的基本类型中会使得性能有所提升

 

39enumerate

同python的enumerate方法

 

40sizeofsizeofValue

#TODO

 

41delegate

可以通过在protocol声明的名字后面加上关键字class来指明这个protocol只能由class来实现,即:

protocolMyClassDelegate: class {}

 

42Lock

swift的线程锁

objective-c可以通过@synchronized关键字来修饰变量为其自动加上互斥锁

而swift不支持该关键字,可以通过objc_sync_enter(anObj)来实现

 

三、swift与开发环境、实践

 

43fatalError

#TODO

 

44playground

延时运行:使用XCPlayground框架可以达到延时运行的效果

可视化:使用XCPlayground的XCPCaptureValue方法可以将一组数据绘制到时间轴上

导入当前项目:在项目中加入playground,即可与项目进行协作

限制:性能、内存管理

 

45JSON

swift没有很好地处理json的方式,可通过json-swift项目来通过重载下标的方式简化JSON操作

 

46、文档注释

方法的文档字符串应如下格式:

/**

A demomethod

 

:param:input an Int number

 

:returns:the string represents the input number

*/

funcmethod(input: Int) -> String{}

 

47Log输出

#TODO

 

48、属性访问控制

Private

Public

Internal

 

49、泛型扩展

扩展泛型类型,无需再生命<T>,也不允许如此声明,直接在扩展中使用T即可

 

 

 

 

0 0
原创粉丝点击