00 Swift 简介
Swift是一种新的编程语言,用于编写iOS,OS X和watchOS应用程序。Swift结合了C和objective-C的优点并且不受C兼容性的限制。Swift采用安全的编程模式并添加了很多新特性,这将使编程更简单,更灵活,也更有趣。Swift是基于成熟而且倍受喜爱的Cocoa和Cocoa Touch框架,它的降临将重新定义软件开发。
Objective-C开发者对Swift并不会感到陌生。它采用了Objective-C的命名参数以及动态对象模型,可以无缝对接到现有的Cocoa框架,并且可以兼容Objective-C代码。在此基础之上,Swift还有许多新特性并且支持过程式编程和面向对象编程。
Swift对于初学者来说也很友好。它是第一个既满足工业标准又像脚本语言一样充满表现力和趣味的编程语言。它支持代码预览,这个革命性的特性可以允许程序员在不编译和运行应用程序的前提下运行Swift代码并实时查看结果。
Swift将现代编程语言的精华和苹果工程师文化的智慧结合了起来。编译器对性能进行了优化,编程语言对开发进行了优化,两者互不干扰,鱼与熊掌兼得。Swift既可以用于开发 "hello,world" 这样的小程序,也可以用于开发一套完整的操作系统。所有的这些特性让Swift对于开发者和苹果来说都是一项值得的投资。
01 Swift 基本语法
一、开始
① 使用下面的 OS Xplayground 创建的 Hello,World!程序,如下所示:
import Cocoa
var myString = "Hello,World! "
println(myString)
② 如果为 iOS playground 创建相同的程序,程序看起来如下:
import UIKit
var myString = "Hello,World! "
println(myString)
二、注释
单个注释使用 // 在注释的开头写入。
//My first program in swift,这是一行注释
Swift不要求必须使用分号在代码每个语句后面,虽然其可选的,但是如果使用分号,编译器不会有什么影响。
如果在同一行,用分号作为分隔符分为多个语句,否则编译器将引发语法错误。如下:
import Cocoa
var myString = "Hello,World! "; println(myString)
三、标识符
Swift标识符是用于识别一个变量,函数,或任何其它用户定义的项目的名称。一个标识符开始于字母 A~Z 或 a~z 或下划线后跟字母或数字 0~9。
Swift不允许标识符中有标点字符,如:@、$、%。
Swift是区分大小写的编程语言。下面是可接受的标识的一些例子:Azad、zara、abc、move_name、a_123、myname50、__temp、ja23b9、retval。
要使用保留字作为标识符,需要在标识符之前和之后把它用反引号 (') 引用起来。
四、关键字
以下关键字在Swift中保留。这些保留字不要用作常量或变量或任何其它标识符名称,除非它们用反引号转义。
五、空格
空格仅包含空格,可能带有注释行,被称为一个空行,Swift编译器完全忽略它。
空格是Swift用来描述空格,制表符,换行符和注释术语。空格分隔一个声明为另一部分,使编译器能够查明在一个声明中的元素,如 int 结束和下一个元素开始。
空格字符不是必须的,但如果希望使用是以可读性为目的,可以加入一些空格。
//:Playground - noun:a place where people can play
import UIKit
//#import <UIKit/UIKit.h>
//var 关键字,表示定义变量的关键字
//类型自动追踪
var myString = "hello swift"
var myInt = 15
var myFloat = 3.14
Let myConstName = "dancer"
myString ="dancerGG"
//myConstName ="dancerMM"
/*
多行注释
*/
print(myString)
print(myInt)
print(myFloat)
//Swift是强语法,定义变量必须指定一个值,不指定就报错
//同一行如果定义了多条语句,需要分号间隔
var num1 = 6;var num2 = 4
02 Swift 数据类型
一、内置数据类型
Swift为程序员提供内置以及用户定义的种类数据类型。以下是声明变量使用最频繁的基本数据类型的列表:
1、Int 或 UInt,这是用于整数。更具体地可以使用 Int32、Int64 来定义32或64位有符号整数,其中 UInt32 或 UInt64 用来定义32或64位无符号整数的变量。
2、Float,这是用来表示一个32位浮点数。
3、Double,这是用来表示一个64位浮点数。
4、Bool,这代表一个布尔值,真或假。
5、String,这是有序字符集合。
6、Character,这是一个单字符。
7、Optional,这表示可以容纳一个值或没有任何值的变量。
有关整数类型要点:
在32位的平台上,in大小与Int32的大小相同。
在64位的平台上,Int大小与Int64的大小相同。
在32位的平台上,Ulnt的大小与UInt32的大小相同。
在64位的平台上,UInt的大小与UInt64的大小相同。
Int8,Int16,Int32,Int64可以用来表示8 Bit,16 Bit,32 Bit和64 Bit形成有符号整数。
UInt8,UInt16,UInt32,UInt64可以用来表示8 Bit,16 Bit,32 Bit和64 Bit形成无符号整数。
二、绑定值
可以从现有类型使用 typealias 创建一个新的名称。例:typealias newname = type
// : Playground-noun : a place where people can play
import UIKit
var str = "Hello,playground"
//typedefine 现有类型 = 新名称
typealias dataType = Int
//类型推断
var age = 15 //Int
age = 8
age = 9
//Swift是强语法结构,不允许给一个已知类型的变量赋值不同类型的数据
//age = 1.9
//int number = 9;
var name : String = "Dancer"
var high : dataType = 169
03 Swift 变量
一、类型注解
当要声明一个变量,可以提供一个类型注解,以明确那种变量的值可以存储。
下面是语法:var variableName: <data type> = <optional initial value>
二、命名变量
一个变量名可以由字母,数字和下划线组成。可以使用简单或Unicode字符来命名变量。
import UIKit
var str = "Hello,playground"
//var变量名(合法的标识符) = 值
var age = 8
var weight = 3.15
var name = "Dancer"
//var 变量名 : 变量类型 = 值(与声明类型相符合的值)
var myAge : Int = 19
var isMan : Bool = false
//Character只允许使用单个字符的字符串赋值
var sex : Character = "M"
var myName : String = "M"
//如果你使用单个字符的字符串给一个未声明类型的变量赋值,那么类型推断的结果是String类型
var mysex = "M"
mysex = "Dancer"
//printf("%d",4);
print(age)
print(name)
print("my name is\(name),and my age is \(age)")
var 人名 = "Dancer"
var 女神 = "诗诗"
var 🐙 = "Love" //emoji
print("\(人名)\(🐙)\(女神)")
04 Swift 可选类型
一、适配型
Swift引入了选配(optionals)型,处理不存在的值。
可选(Optional)是一种自己所有的,实际上是Swift新的超能力枚举之一。它有两个可能的值,无和有(T)。其中T是Swift中提供正确的数据类型的关联值。
这里是一个可选的整数声明:var perhapsInt : Int?
这里是一个可选的字符串声明:var perhapsStr:String?
下述声明明确初始化为nil,意味着没有任何值:var perhapsstr : String? = nil
二、强制解包
如果定义一个变量作为配选(optional)再获得这个变量的值,则必须解开它。这只是意味着把一个感叹号放在变量的未尾。
三、可选绑定
使用可选绑定以找出一个可选(optional)是否包含一个值,如果是这样,使该值可以作为一个临时常数或变量。
import UIKit
var str = "Hello,playground"
//声明一个可选类型结构 var变量名:变量类型?
var name:String?
var age:Int?
var weight:Float?
var myName:String? = nil
myName = "Dancer"
//可选类型,在使用数据值的时候,需要使用 ! 进行解包
print(myName!)
//也可以使用 ! 声明一个变量为可选类型(自动解包)
var yourName:String! = "dancer"
print(yourName)
/*
if let标示符 = 可选类型{
statements
}
*/
if let name = myName{
//如果myName这个可选类型有值,则执行此条语句
print("name = \(name)")
}
print("后续语句")
05 Swift 常量+运算符
常量指的是程序无法在其执行期间改变的固定值。
可以是整型常量,浮点常量,字符常量等基本数据类型。也可以是枚举常量。
这些常量和常规变量处理一样,只是它们的值不能在定义后进行修改。
一、声明常量
使用常量时,必须使用关键字 let 声明它们:let constantName = <initial value>
二、命名常量
一个常数的名称可以由字母,数字和下划线组成。
三、字面量
字面量是整数,浮点数或字符串类型的一个值的源代码表示。
1、整数字面量
一个整型字面量可以是十进制,二进制,八进制,或十六进制常量。二进制以0B开始,十进制以0o开始,十六进制以0x开始,没有的则为十进制。
2、浮点字面量
浮点字面量有整数部分,小数点,小数部分和一个指数部分。可以以十进制或十六进制形式来表示浮点字面量。
十进制浮点字面量由十进制数字后跟一个小数,小数指数,或两者序列。
十六进制的浮点字面量是由一个0x前缀,后面跟着一个可选的十六进制分数,后面跟十六进制指数。
3、字符串字面量
字符串字面值是由双引号包围,以下形式的字符序列:"characters"
字符串常量不能包含转义双引号("),转义反斜线(\),回车或换行。特殊字符可以使用以下转义序列字符串:
4、布尔类型字面量
有三个布尔字面量:真值 - true、假值 - false、无值 - nil。
四、运算符
1、算术运算符
下表列出了所有Swift语言支持的算术运算符。假设变量A=10,B=20
2、比较运算符
3、逻辑运算符
下表列出了所有Swift语言支持的逻辑运算符。假设变量A=1,B=0
4、位运算符
下表列出了所有Swift语言支持的位运算符。假设变量A=60,B=13
5、赋值运算符
6、范围运算符
7、其他运算符
运算符优先级
运算符优先级决定术语的表达分组,影响表达式如何计算。例如,乘法运算符的优先级比加法运算符高。
06 Swift 流程控制语句
swift提供决策语句有以下几种类型。
一、? : 操作符
在前面的章节中可用 if...else 语句来代替。它一般形式如下:Exp1 ? Exp2 : Exp3
二、循环语句
三、循环控制语句
循环控制语句改变其正常的执行顺序。当执行离开一个作用域,在该作用域创建的所有自动对象被销毁。
import Foundation
//if(条件表达式)
// 语句;
//if 条件表达式 {
// 语句1;
//}
//语句2;
var age : Int = 10
if age<10 {
print("幼年")
}
else if age<18&&age>=10 {
print("青少年")
}
else{
print("成年")
}
if age<10 {
if age <5{
print("baby")
}
}
var color : Int = 0
switch color {
case 0:
print("red")
fallthrough
case 1:
print("blue")
break
case 2:
print("yellow")
//swift的switch需要以default结尾
default:
print("other")
}
var name : String = "dancer"
let result = name == "dancer" ? "YES": "NO"
print (result)
switch name {
case "dancer":
print("dancer is a good man")
case "lucy":
print ("Lucy is a good girl")
default:
print ("other")
}
for (var i=0; i < 10; i++) {
print ("i = \(i)")
}
var number = 10
while number < 20 {
print ("number =\(number)")
++number
}
number = 11
repeat {
number++
print ("repeat while num=\(number)")
} while number < 20
/*
a...b,其中包括a,b
a..<b,其中不包括a,b
1,循环变量不需要使用var/let来进行声明
2,如果不关注循环变量本身的值,可以用_来代替
*/
for _ in 1..<10 {
// print("index:\(index)")
print("dancer")
}