Week 2
Swift grammer
if make a OS X playground we need Cocoa
if make a IOS playground we need UIKit
Swift 引入
我们可以使用 import 语句来引入任何的 Objective-C 框架(或 C 库)到 Swift 程序中。例如 import cocoa 语句导入了使用了 Cocoa 库和API,我们可以在 Swift 程序中使用他们。
Cocoa 本身由 Objective-C 语言写成,Objective-C 又是 C 语言的严格超集,所以在 Swift 应用中我们可以很简单的混入 C 语言代码,甚至是 C++ 代码。
Swift 标记
swift 程序由多种标记组成,标记可以是单词,标识符,常量,字符串或符号
eg
print(“test!") // 单词(print) 符号(()字符串(”test”)
注释
Swift的注释与C语言极其相似,单行注释以两个反斜线开头:
//这是一行注释
多行注释以/*开始,以*/结束:
/* 这也是一条注释,
但跨越多行 */
与 C 语言的多行注释有所不同的是,Swift 的多行注释可以嵌套在其他多行注释内部。写法是在一个多行注释块内插入另一个多行注释。第二个注释块封闭时,后面仍然接着第一个注释块:
/* 这是第一个多行注释的开头
/* 这是嵌套的第二个多行注释 */
这是第一个多行注释的结尾 */
多行注释的嵌套是你可以更快捷方便的注释代码块,即使代码块中已经有了注释。
分号
与其它语言不同的是,Swift不要求在每行语句的结尾使用分号(;),但当你在同一行书写多条语句时,必须用分号隔开:
import Cocoa
/* 我的第一个 Swift 程序 */
var myString = "Hello, World!"; print(myString)
标识符
标识符就是给变量、常量、方法、函数、枚举、结构体、类、协议等指定的名字
Swift语言中标识符的命名规则如下:
- 区分大小写
- 标识符首字符可以以下划线(_)或者字母开始,但不能是数字;
- 标识符中其他字符可以是下划线(_)、字母或数字。
例如: userName、User_Name、_sys_val、身高等为合法的标识符,而2mail、room#和class为非法的标识符。
注意:Swift中的字母采用的是Unicode编码[1]。Unicode叫做统一编码制,它包含了亚洲文字编码,如中文、日文、韩文等字符,甚至是我们在聊天工具中使用的表情符号
如果一定要使用关键字作为标识符,可以在关键字前后添加重音符号(`),例如:
let `class` = "Runoob"
关键字emmmmmmm so many
Swift 空格
Swift对空格的使用有一定的要求
在Swift中,运算符不能直接跟在变量或常量的后面。
例如下面的代码会报错:
let a= 1 + 2
错误信息是:
error: prefix/postfix '=' is reserved
意思大概是等号直接跟在前面或后面这种用法是保留的。
下面的代码还是会报错(继续注意空格):
let a = 1+ 2
错误信息是:
error: consecutive statements on a line must be separated by ';'
这是因为Swift认为到1+这个语句就结束了,2就是下一个语句了。
只有这样写才不会报错:
let a = 1 + 2; // 编码规范推荐使用这种写法
let b = 3+4 // 这样也是OK的
Swift 字面量
所谓字面量,就是指像特定的数字,字符串或者是布尔值这样,
能够直接了当地指出自己的类型并为变量进行赋值的值。
比如在下面:
42 // 整型字面量
3.14159 // 浮点型字面量
"Hello, world!" // 字符串型字面量
true // 布尔型字面量
打印输出
Swift 使用 print 函数打印输出:
print("Runoob") // 输出 Runoob
print 函数是一个全局函数,完整的函数签名为:
public func print(items: Any..., separator: String = default, terminator: String = default)
如果我们想让其不换行输出,只需要将最后一个参数赋值为空字符串即可:
for x in 0...10{
print("\(x) ", terminator: "")
}
print()
输出结果为:
0 1 2 3 4 5 6 7 8 9 10
如果你需要接收用户的输入可以使用 readLine():
let theInput = readLine()
Swift 数据类型
内置数据类型
Int
一般来说,你不需要专门指定整数的长度。
Swift 提供了一个特殊的整数类型Int,长度与当前平台的原生字长相同:
- 在32位平台上,Int和Int32长度相同。
- 在64位平台上,Int和Int64长度相同。
除非你需要特定长度的整数,一般来说使用Int就够了。
这可以提高代码一致性和可复用性。
即使是在32位平台上,
Int可以存储的整数范围也可以达到-2,147,483,648~2,147,483,647,
大多数时候这已经足够大了。
UInt
Swift 也提供了一个特殊的无符号类型UInt,长度与当前平台的原生字长相同:
- 在32位平台上,UInt和UInt32长度相同。
- 在64位平台上,UInt和UInt64长度相同。
注意: 尽量不要使用UInt,
除非你真的需要存储一个和当前平台原生字长相同的无符号整数。
除了这种情况,最好使用Int,即使你要存储的值已知是非负的。
统一使用Int可以提高代码的可复用性,
避免不同类型数字之间的转换,
并且匹配数字的类型推断。
整数类型需要注意以下几点:
- 在 32 位系统上, Int 和 Int32 长度相同。
- 在 64 位系统上, Int 和 Int64 长度相同。
- 在 32 位系统上, UInt 和 UInt32 长度相同。
- 在 64 位系统上, UInt 和 UInt64 长度相同。
- Int8, Int16, Int32, Int64 分别表示 8 位, 16 位, 32 位, 和 64 位的有符号整数形式。
- UInt8, UInt16, UInt32, UInt64 分别表示 8 位, 16 位, 32 位 和 64 位的无符号整数形式。
浮点数:Float、Double
浮点数是有小数部分的数字,比如 3.14159,0.1 和 -273.15。
浮点类型比整数类型表示的范围更大,可以存储比 Int 类型更大或者更小的数字。
Swift 提供了两种有符号浮点数类型:
- Double 表示64位浮点数。当你需要存储很大或者很高精度的浮点数时请使用此类型。
- Float 表示32位浮点数。精度要求不高的话可以使用此类型。
注意:
Double精确度很高,至少有15位数字,而 Float 最少只有6位数字。
选择哪个类型取决于你的代码需要处理的值的范围。
布尔值:Bool
Swift 有一个基本的布尔(Boolean)类型,叫做 Bool。
布尔值指逻辑上的值,因为它们只能是真或者假。
Swift 有两个布尔常量,true 和 false。
字符串:String
字符串是字符的序列集合,例如:
"Hello, World!"
字符:Character
字符指的是单个字母,例如:
"C"
可选类型:Optional
使用可选类型来处理值可能缺失的情况。可选类型表示有值或没有值。
数值范围
下表显示了不同变量类型内存的存储空间,及变量类型的最大最小值:
类型 | 大小(字节) | 区间值 |
Int8 | 1 字节 | -128 到 127 |
UInt8 | 1 字节 | 0 到 255 |
Int32 | 4 字节 | -2147483648 到 2147483647 |
UInt32 | 4 字节 | 0 到 4294967295 |
Int64 | 8 字节 | -9223372036854775808 到 9223372036854775807 |
UInt64 | 8 字节 | 0 到 18446744073709551615 |
Float | 4 字节 | 1.2E-38 到 3.4E+38 (~6 digits) |
Double | 8 字节 | 2.3E-308 到 1.7E+308 (~15 digits) |
类型别名
类型别名对当前的类型定义了另一个名字,类型别名通过使用 typealias 关键字来定义。
语法格式如下:
typealias newname = type
例如以下定义了 Int 的类型别名为 Feet:
typealias Feet = Int
现在,我们可以通过别名来定义变量:
import Cocoa
typealias Feet = Int
var distance: Feet = 100
print(distance)
我们使用 playground 执行以上程序,输出结果为:
100
类型安全
Swift 是一个类型安全(type safe)的语言。
由于 Swift 是类型安全的,所以它会在编译你的代码时进行类型检查(type checks),
并把不匹配的类型标记为错误。这可以让你在开发的时候尽早发现并修复错误。
import Cocoa
var varA = 42
varA = "This is hello"
print(varA)
以上程序,会在 Xcode 中报错:
error: cannot assign value of type 'String' to type 'Int'
varA = "This is hello"
意思为不能将 'String' 字符串赋值给 'Int' 变量。
类型推断
当你要处理不同类型的值时,类型检查可以帮你避免错误。
然而,这并不是说你每次声明常量和变量的时候都需要显式指定类型。
如果你没有显式指定类型,Swift 会使用类型推断(type inference)来选择合适的类型。
例如,如果你给一个新常量赋值42并且没有标明类型
Swift 可以推断出常量类型是Int,因为你给它赋的初始值看起来像一个整数:
let meaningOfLife = 42
// meaningOfLife 会被推测为 Int 类型
同理,如果你没有给浮点字面量标明类型,Swift 会推断你想要的是Double:
let pi = 3.14159
// pi 会被推测为 Double 类型
当推断浮点数的类型时,Swift 总是会选择Double而不是Float。
如果表达式中同时出现了整数和浮点数,会被推断为Double类型:
let anotherPi = 3 + 0.14159
// anotherPi 会被推测为 Double 类型
原始值3没有显式声明类型,而表达式中出现了一个浮点字面量
所以表达式会被推断为Double类型。
实例
import Cocoa
// varA 会被推测为 Int 类型
var varA = 42
print(varA)
// varB 会被推测为 Double 类型
var varB = 3.14159
print(varB)
// varC 也会被推测为 Double 类型
var varC = 3 + 0.14159
print(varC)
执行以上代码,输出结果为:
42
3.14159
3.14159
Swift 变量
变量是一种使用方便的占位符,用于引用计算机内存地址。
Swift 每个变量都指定了特定的类型
该类型决定了变量占用内存的大小,不同的数据类型也决定可存储值的范围。
上一章节我们已经为大家介绍了基本的数据类型
包括整形Int、浮点数Double和Float、布尔类型Bool以及字符串类型String
此外,Swift还提供了其他更强大数据类型
Optional, Array, Dictionary, Struct, 和 Class 等。
接下来我们将为大家介绍如何在 Swift 程序中声明和使用变量。
变量声明
变量声明意思是告诉编译器在内存中的哪个位置上为变量创建多大的存储空间。
在使用变量前,你需要使用 var 关键字声明它,如下所示:
var variableName = <initial value>
以下是一个 Swift 程序中变量声明的简单实例:
import Cocoa
var varA = 42
print(varA)
var varB:Float
varB = 3.14159
print(varB)
以上程序执行结果为:
42
3.14159
变量命名
变量名可以由字母,数字和下划线组成。
变量名需要以字母或下划线开始。
Swift 是一个区分大小写的语言,所以字母大写与小写是不一样的。
变量名也可以使用简单的 Unicode 字符,如下实例:
import Cocoa
var _var = "Hello, Swift!"
print(_var)
var 你好 = "你好世界"
var 菜鸟教程 = "www.runoob.com"
print(你好)
print(菜鸟教程)
以上程序执行结果为:
Hello, Swift!
你好世界
www.runoob.com
变量输出
变量和常量可以使用 print(swift 2 将 print 替换了 println) 函数来输出。
在字符串中可以使用括号与反斜线来插入变量,如下实例:
import Cocoa
var name = "菜鸟教程"
var site = "http://www.runoob.com"
print("\(name)的官网地址为:\(site)")
以上程序执行结果为:
菜鸟教程的官网地址为:http://www.runoob.com