一个 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 { // 正确 }
未完待续