Ziank的技术博客

swift的一些注意点(2)

之前说了在学习swift过程中发现的一些和其他语言不同的点,最近在使用swift语言进行一个简单计算器的开发工作,在使用中又发现了一些需要注意的地方,这里就简单的说一下。

###6. switch/case的使用
和其他语言一样,swift也支持switch的使用。但是和其他语言不同的是,swift里面的每一个case分支不需要显示break,而是在执行结束后会自动break。
而且如果对不同case执行相同操作的话,和其他语言的写法也不相同。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
init(calc: CalcType) {
calcElement = NodeType.Action(calc)
switch calc {
case .Add, .Minus, .Mod:
calcOrder = CalcOrder.Add
case .Multi, .Divide:
calcOrder = CalcOrder.Multi
case .And, .Or, .Xor:
calcOrder = CalcOrder.Logic
case .ShiftLeft, .ShiftRight:
calcOrder = CalcOrder.Shift
}
super.init()
}

###7. 成员变量getter/setter方法的定义
OC中get/set方法的定义一般是通过getter/setter来声明,或者直接修改系统默认的getter/setter方法。而在swift中对属性的getter/setter方法实在定义该属性时直接通过get/set进行设置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var value:UInt {
get {
switch self.calcElement {
case let .Number(number):
return number
case let .Action(str):
return self.calcValue(str)
}
}
set (newValue) {
self.value = newValue
}
}

###8. enum的使用
在OC等语言中,enum就是一个枚举类型,只能够定义一组枚举常量。但是在swift中,enum除了类似功能以外,还可以把不同的数据类型存储在同一个变量中,有点类似于C中union的用法。
如可以这样定义enum:

1
2
3
4
enum NodeType {
case Number(UInt)
case Action(CalcType)
}

那么在NodeType类型的变量中就会有一个UInt或者是CalcType类型的变量,可以在适当的时候获取对应的数据。由7的示例代码中可以看到,当需要获取对应数据时,使用case let可以把数据从enum的变量中获取出来。

当然,在enum中也可以直接定义函数,用来对内部的一些数据进行处理。

1
2
3
4
5
6
7
8
9
10
enum CalcOrder:Int {
case Number = 5
case Add = 1
case Multi = 2
case Logic = 3
case Shift = 4
func isLargerThan(val:CalcOrder) -> Bool {
return self.rawValue > val.rawValue
}
}

###9. 函数外部参数名的使用规则
我们前面说过函数外部参数名的概念,其实也就是参数的一个外部调用标签。那么在调用时这些标签是否能够省略是有着以下规则的:

  1. 在类型的init方法调用时是必须要加入参数标签的
  2. 在类的实例方法和类方法中,对其调用时Swift将忽略第一个参数的标签,而强制要求之后的参数名称
  3. 在全局方法中,所有的参数标签默认都是忽略掉得

暂时就先说这么多了,后续有新的内容,会再添加补充。