一个 C++ 程序员眼中的 Swift(一)
On 2014-11-11 22:23:49 By Soli一个 C++ 程序员眼中的 Swift(一)
本文记录了作为一个 C++ 程序员,在学习 Swift 的过程中发现的一些有趣的特性。有的是 C++ 中已经有但 Swift 做的更好的,有的是 C++ 中还没有的或者隐藏的比较深的。总有些特性能引起你的兴趣,去更深入的了解 Swift 这门新兴的语言。
总之,作为程序员学习一门新语言还是有必要的。尤其是在对一两门语言有了深厚的基础之后,学习一门新语言并不会花费你太多的时间和精力,但你却能从中获益颇丰,至少可以拓展思路,开阔视野。
- 常量和变量 - 用 - let声明/定义常量,用- var声明/定义变量。- let maxCount = 10 var currentCount = 2
- 句末分号 - 语句末尾不要求分号,即可有可无。 
- 类型 - 声明/定义常量或变量时,大部分情况下都无需指定类型。Swift 可以根据初始值或函数返回值等推断常量或变量的类型(想象一下你在 C++ 中声明一个容器的迭代器的情景)。当然,如果你不放心,也可以给 Swift 一个『提示』。 - let name = "Swift" let name: String = "Swift" var red, blue, green: Int
- 常量变量名 - 常量变量名支持 Unicode ,你甚至可以使用 emoji ! - let π = 3.14159 let 你好 = "你好世界" let 🐶🐮 = "dogcow" // 在支持 emoji 的系统上才能正常显示- 更有趣的是,你还可以使用 Swift 的保留字来做常量变量名,只需用 ` (数字 1 前面那个按键)把它括起来就行。 - var `var` = "Var"
- 打印常量变量 - 不同于 C/C++ 中的使用格式化串作为占位符,Swift 直接把常量变量插入到要打印的串中。 - let langName = "Swift" println("Hello, \(langName)")- 这叫做『字符串插值』。在 - \()里还可以做更复杂的事情。- let π = 3.14159 var radius = 5 let message = "The circumference is \(2 * π * radius)cm" let words = "🐶🐮" println("The number of characters in \(words) is \(countElements(words))")
- 注释支持嵌套 - 这样可以方便的注释掉一段含有多行注释的代码。 
- 大一统的整型 - 很多 C/C++ 程序员都会郁闷的一件事是,整型 - int无论在 32 位平台还是在 64 位平台都只占 4 个字节。但在 Swift 里整型- Int或- UInt是平台相关的,即在 32 位平台上是 32 位的长度,在 64 位平台上是 64 位的长度。这看似更复杂了,但 Swift 中没有了- short、- long和- long long,也就是说整型终于大一统了。- 如果体会还不深的话,那试着说出下面这几个表达式的值吧: - sizeof(short) sizeof(short int) sizeof(int) sizeof(long) sizeof(long int) sizeof(long long) sizeof(long long int) sizeof(long double) // 这个不是整型,是来凑数的。 sizeof(void*) sizeof(int*) sizeof(char*)
- 基本类型其实并不是『基本类型』 - Swift 中也有 - Int、- Float、- Double等这些『基本类型』。但它们其实也是『类』。- let maxInt = Int.max let minInt = Int.min
- 终于有了二进制数 - 在 C/C++ 中我们定义二进制数的时候一般都使用十六进制 - 0x来表示。但每次都得在脑子里转好几圈以确认是否正确。尤其是在做位运算时,十六进制真的不是那么讨人喜欢。- Swift 支持 - 0b前缀的二进制表示。一睹为快:- let MaskRead = 0b0001 let MaskWrite= 0b0010 let MaskExec = 0b0100 let MaskAll = 0b0111
- 大数中的分隔符 - 如果一个数很大,我们很难一眼看出它的大小。这时我们会用逗号把数字分隔开来以便识别。比如, - 10000000写成- 1000,0000是不是一下就能看出是一千万?- Swift 中是这样写的: - let billion = 10_0000_0000
- 不再隐式类型转换 - let i8: Int8 = Int8.max let i16:Int16= Int16.max let i: Int = i8 + i16 // 编译错误 let ii16: Int16 = Int16(i8) + i16 // 运行错误,因为结果已经超出 Int16 let ii: Int = Int(i8) + Int(i16) // 正确 let b = 1 if b { // 编译错误 } if b == 1 { // 正确 }
- 未完待续 
 Except where otherwise noted, content on this site is licensed under a
		
			Creative Commons Attribution 4.0 International license
		
		.
		
		Except where otherwise noted, content on this site is licensed under a
		
			Creative Commons Attribution 4.0 International license
		
		.