基础语法
如果创建的是 OS X playground 需要引入 Cocoa
如果我们想创建 iOS playground 则需要引入 UIKit
Swift 引入
我们可以使用 import 语句来引入任何的 Objective-C 框架(或 C 库)到 Swift 程序中。例如 import cocoa 语句导入了使用了 Cocoa 库和API,我们可以在 Swift 程序中使用他们。
Cocoa 本身由 Objective-C 语言写成,Objective-C 又是 C 语言的严格超集,所以在 Swift 应用中我们可以很简单的混入 C 语言代码,甚至是 C++ 代码。
注释
Swift的注释与C语言极其相似,单行注释以两个反斜线开头
多行注释以/*开始,以*/结束
与 C 语言的多行注释有所不同的是,Swift 的多行注释可以嵌套在其他多行注释内部。写法是在一个多行注释块内插入另一个多行注释。第二个注释块封闭时,后面仍然接着第一个注释块方便的注释代码块,即使代码块中已经有了注释。
标识符
标识符就是给变量、常量、方法、函数、枚举、结构体、类、协议等指定的名字。构成标识符的字母均有一定的规范,Swift语言中标识符的命名规则如下:
区分大小写,Myname与myname是两个不同的标识符;
标识符首字符可以以下划线(_)或者字母开始,但不能是数字;
标识符中其他字符可以是下划线(_)、字母或数字。
例如: userName、User_Name、_sys_val、身高等为合法的标识符,而2mail、room#和class为非法的标识符。
注意:Swift中的字母采用的是Unicode编码[1]。Unicode叫做统一编码制,它包含了亚洲文字编码,如中文、日文、韩文等字符,甚至是我们在聊天工具中使用的表情符号
如果一定要使用关键字作为标识符,可以在关键字前后添加重音符号(`)
关键字
关键字是类似于标识符的保留字符序列,除非用重音符号(`)将其括起来,否则不能用作标识符。关键字是对编译器具有特殊意义的预定义保留标识符。常见的关键字有以下4种
与声明有关的关键字
与语句有关的关键字
表达式和类型关键字
在特定上下文中使用的关键字
Swift 空格
Swift语言并不是像C/C++,Java那样完全忽视空格,Swift对空格的使用有一定的要求,但是又不像Python对缩进的要求那么严格。
在Swift中,运算符不能直接跟在变量或常量的后面。例如下面的代码会报错:let a= 1+2
下面的代码还是会报错(继续注意空格):let a = 1+ 2
这是因为Swift认为到1+这个语句就结束了,2就是下一个语句了。
只有这样写才不会报错:let a = 1 + 2 编码推荐 let a = 4+5 这样也是OK
Swift 字面量
所谓字面量,就是指像特定的数字,字符串或者是布尔值这样,能够直接了当地指出自己的类型并为变量进行赋值的值。比如在下面:
4
3.1415926
"hollow world"
true
打印输出
Swift 使用 print 函数打印输出: print("输出") //输出
print 函数是一个全局函数,完整的函数签名为:
如果我们想让其不换行输出,只需要将最后一个参数赋值为空字符串即可:
如果你需要接收用户的输入可以使用 readLine(): let theinput = readLine()
数据类型
Swift 数据类型
在我们使用任何程序语言编程时,需要使用各种数据类型来存储不同的信息。
变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。在声明变量时也可指定它的数据类型。
所有变量都具有数据类型,以决定能够存储哪种数据。
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可以提高代码的可复用性,避免不同类型数字之间的转换,并且匹配数字的类型推断,请参考类型安全和类型推断。
浮点数
浮点数是有小数部分的数字,比如3.14159,0.1和-273.15。
浮点类型比整数类型表示的范围更大,可以存储比Int类型更大或者更小的数字。Swift 提供了两种有符号浮点数类型:
Double表示64位浮点数。当你需要存储很大或者很高精度的浮点数时请使用此类型。
Float表示32位浮点数。精度要求不高的话可以使用此类型。
注意:
Double精确度很高,至少有15位数字,而Float最少只有6位数字。选择哪个类型取决于你的代码需要处理的值的范围。
布尔值
Swift 有一个基本的布尔(Boolean)类型,叫做Bool。布尔值指逻辑上的值,因为它们只能是真或者假。Swift 有两个布尔常量,true和false。
字符串
字符串是字符的序列集合,例如:
"Hello, World!"
字符
字符指的是单个字母,例如:
"C"
可选类型
使用可选类型(optionals)来处理值可能缺失的情况。可选类型表示有值或没有值。
数值范围
下表显示了不同变量类型内存的存储空间,及变量类型的最大最小值:
类型别名
类型别名对当前的类型定义了另一个名字,类型别名通过使用 typealias 关键字来定义。语法格式如下:
typealias newname = type
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 Cocoavar
varA = 42
print(varA)
var varB:Float
varB = 3.14159
print(varB)
以上程序执行结果为:43 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
Swift 可选(Optionals)类型
Swift 的可选(Optional)类型,用于处理值缺失的情况。可选表示"那儿有一个值,并且它等于 x "或者"那儿没有值"。
Swfit语言定义后缀?作为命名类型Optional的简写,换句话说,以下两种声明是相等的:
var optionalInteger: Int?
var optionalInteger: Optional <Int>
在这两种情况下,变量 optionalInteger 都是可选整数类型。注意,在类型和 ?之间没有空格。
Optional 是一个含有两种情况的枚举,None 和 Some(T),用来表示可能有或可能没有值。任何类型都可以明确声明为(或者隐式转换)可选类型。当声明一个可选类型的时候,要确保用括号给 ? 操作符一个合适的范围。例如,声明可选整数数组,应该写成 (Int[])? 写成 Int[]? 会报错。
当你声明一个可选变量或者可选属性的时候没有提供初始值,它的值会默认为 nil。
可选项遵照 LogicValue 协议,因此可以出现在布尔环境中。在这种情况下,如果可选类型T?包含类型为T的任何值(也就是说它的值是 Optional.Some(T) ),这个可选类型等于 true,反之为 false。
如果一个可选类型的实例包含一个值,你可以用后缀操作符 !来访问这个值,如下所示:
optionalInteger = 42
optionalInteger! // 42
使用操作符!去获取值为nil的可选变量会有运行时错误。
你可以用可选链接和可选绑定选择性执行可选表达式上的操作。如果值为nil,任何操作都不会执行,也不会有运行报错。
让我们来详细看下以下实例来了解 Swift 中可选类型的应用:
import Cocoa
var myString:String? = nil
if myString != nil
{
print(myString)
}else
{
print("字符串为 nil")
}
以上程序执行结果为:
字符串为 nil
可选类型类似于Objective-C中指针的nil值,但是nil只对类(class)有用,而可选类型对所有的类型都可用,并且更安全。
强制解析
当你确定可选类型确实包含值之后,你可以在可选的名字后面加一个感叹号(!)来获取值。这个感叹号表示"我知道这个可选有值,请使用它。"这被称为可选值的强制解析(forced unwrapping)。
实例如下:
import Cocoa
var myString:String?
myString = "Hello, Swift!"
if myString != nil
{
print(myString)
}else{
print("myString 值为 nil")
}
以上程序执行结果为:Optional("Hello, Swift!")
强制解析可选值,使用感叹号(!):
import Cocoa
var myString:String?
myString = "Hello, Swift!"
if myString != nil
{ // 强制解析
print( myString! )
}
else{
print("myString 值为 nil")
}
以上程序执行结果为:
Hello, Swift!
注意:
使用!来获取一个不存在的可选值会导致运行时错误。使用!来强制解析值之前,一定要确定可选包含一个非nil的值。
自动解析
你可以在声明可选变量时使用感叹号(!)替换问号(?)。这样可选变量在使用时就不需要再加一个感叹号(!)来获取值,它会自动解析。
实例如下:
import Cocoa
var myString:String!
myString = "Hello, Swift!"
if myString != nil
{
print(myString)
}
else{
print("myString 值为 nil")
}
以上程序执行结果为:
Hello, Swift!
可选绑定
使用可选绑定(optional binding)来判断可选类型是否包含值,如果包含就把值赋给一个临时常量或者变量。可选绑定可以用在if和while语句中来对可选类型的值进行判断并把值赋给一个常量或者变量。
像下面这样在if语句中写一个可选绑定:
if let constantName = someOptional {
statements
}
让我们来看下一个简单的可选绑定实例:
import Cocoa
var myString:String?
myString = "Hello, Swift!"
if let yourString = myString
{
print("你的字符串值为 - \(yourString)")
}else
{
print("你的字符串没有值")
}
以上程序执行结果为:
你的字符串值为 - Hello, Swift!
Swift 常量
常量一旦设定,在程序运行时就无法改变其值。
常量可以是任何的数据类型如:整型常量,浮点型常量,字符常量或字符串常量。同样也有枚举类型的常量:
常量类似于变量,区别在于常量的值一旦设定就不能改变,而变量的值可以随意更改。
常量声明
常量使用关键字 let 来声明,语法如下:let constantName = <initial value>
以下是一个简单的 Swift 程序中使用常量的实例:
import Cocoa
let constA = 42
print(constA)
以上程序执行结果为:42
类型标注
当你声明常量或者变量的时候可以加上类型标注(type annotation),说明常量或者变量中要存储的值的类型。如果要添加类型标注,需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称。
var constantName:<data type> = <optional initial value>
以下是一个简单是实例演示了 Swift 中常量使用类型标注。需要注意的是常量定义时必须初始值:
import Cocoa
let constA = 42
print(constA)
let constB:Float = 3.14159
print(constB)
以上程序执行结果为:42 3.14159
常量命名
常量的命名可以由字母,数字和下划线组成。
常量需要以字母或下划线开始。
Swift 是一个区分大小写的语言,所以字母大写与小写是不一样的。
常量名也可以使用简单的 Unicode 字符,如下实例:
let _const = "Hello, Swift!"
print(_const)
let 你好 = "你好世界"
print(你好)
以上程序执行结果为:
Hello, Swift!
你好世界
常量输出
变量和常量可以使用 print(swift 2 将 print 替换了 println) 函数来输出。
在字符串中可以使用括号与反斜线来插入常量,如下实例:
let name = "菜鸟教程"
let site = "http://www.runoob.com"
print("\(name)的官网地址为:\(site)")
以上程序执行结果为:
菜鸟教程的官网地址为:http://www.runoob.com
Swift 字面量
所谓字面量,就是指像特定的数字,字符串或者是布尔值这样,能够直接了当地指出自己的类型并为变量进行赋值的值。比如在下面:
let aNumber = 3 //整型字面量
let aString = "Hello" //字符串字面量
let aBool = true //布尔值字面量
整型字面量
整型字面量可以是一个十进制,二进制,八进制或十六进制常量。 二进制前缀为 0b,八进制前缀为 0o,十六进制前缀为 0x,十进制没有前缀:
以下为一些整型字面量的实例:
let decimalInteger = 17 // 17 - 十进制表示
let binaryInteger = 0b10001 // 17 - 二进制表示
let octalInteger = 0o21 // 17 - 八进制表示
let hexadecimalInteger = 0x11 // 17 - 十六进制表示
浮点型字面量
浮点型字面量有整数部分,小数点,小数部分及指数部分。
除非特别指定,浮点型字面量的默认推导类型为 Swift 标准库类型中的 Double,表示64位浮点数。
浮点型字面量默认用十进制表示(无前缀),也可以用十六进制表示(加前缀 0x)。
十进制浮点型字面量由十进制数字串后跟小数部分或指数部分(或两者皆有)组成。十进制小数部分由小数点 . 后跟十进制数字串组成。指数部分由大写或小写字母 e 为前缀后跟十进制数字串组成,这串数字表示 e 之前的数量乘以 10 的几次方。例如:1.25e2 表示 1.25 ⨉ 10^2,也就是 125.0;同样,1.25e-2 表示 1.25 ⨉ 10^-2,也就是 0.0125。
十六进制浮点型字面量由前缀 0x 后跟可选的十六进制小数部分以及十六进制指数部分组成。十六进制小数部分由小数点后跟十六进制数字串组成。指数部分由大写或小写字母 p 为前缀后跟十进制数字串组成,这串数字表示 p 之前的数量乘以 2 的几次方。例如:0xFp2 表示 15 ⨉ 2^2,也就是 60;同样,0xFp-2 表示 15 ⨉ 2^-2,也就是 3.75。
负的浮点型字面量由一元运算符减号 - 和浮点型字面量组成,例如 -42.5。
浮点型字面量允许使用下划线 _ 来增强数字的可读性,下划线会被系统忽略,因此不会影响字面量的值。同样地,也可以在数字前加 0,并不会影响字面量的值。
以下为一些浮点型字面量的实例:
let decimalDouble = 12.1875 //十进制浮点型字面量
let exponentDouble = 1.21875e1 //十进制浮点型字面量
let hexadecimalDouble = 0xC.3p0 //十六进制浮点型字面量
字符串型字面量
字符串型字面量由被包在双引号中的一串字符组成,形式如下:
"characters"
字符串型字面量中不能包含未转义的双引号 (")、未转义的反斜线(\)、回车符或换行符。
以下为字符串字面量的简单实例:
let stringL = "Hello\tWorld\n\n菜鸟教程官网:\'http://www.runoob.com\'"
print(stringL)
以上程序执行结果为:
Hello World菜鸟教程官网:'http://www.runoob.com'
布尔型字面量
布尔型字面量的默认类型是 Bool。
布尔值字面量有三个值,它们是 Swift 的保留关键字:
true 表示真。
false 表示假。
nil 表示没有值。