1.什么是swift
2014年,苹果公司推出的全新编程语言
天朝翻译为雨燕,logo就是个雨燕
跟oc一样都用于ios,mac
2010-2014.4年开发
2.语法特点
可以看到oc,javascript,c#,python等语言影子
借鉴了这些语言的优势,同时具备编译型语言的高能性,和脚本语言的灵活性【不需要全部编译通过,才能运行】
3.相关数据
Xcode>6.0
mac >10.9.3
4.注意
swift的源文件的拓展名是.swift
比如:main.swift
两个不需要
a.不需要写main函数
从上往下依次执行,所以最前面的代码自动当做程序的入口
b.不需要每一条语句都加分号
let num = 2
加上也是对的
但是---如果同一行代码,有几条语句的时候,需要加上分号
let a = 1;let b = 2;let c= 3
注释
单行注释
//这是当行注释
多行注释
/*
这是多行注释
这是多行注释
*/
多行注释可以嵌套使用
/*
外层注释
/*
内层注释
内层注释
*/
外层注释
*/
5.常量与变量
let 声明常量
let radius = 10
var 声明变量
var age = 20
var x = 0, y = 1 , z= 2
命名
基本上可以用任何你喜欢的字符作为常量和变量名
let = "苹果"
let 电话 = “110”
let💩 = “一坨”
control+command + 空格 输出emoji
6.字符串简单操作
字符串是String类型,用“”包住内容
let str = "123"
let str2 = "456"
用加号,字符串拼接【两个不同类型的数据不能相加】
let str3 = str + str2;
用反斜线\和小口号()做字符串插值(把常量,变量插入到字符串中)
let hand = 2
var age = 10
let str = "我今年\(age)岁,有\(hand)只手"
7.打印输出
println--输出内容后自动换行
print -- 少了自动换行的功能
8.数据类型
Int,Float,Double,Bool,Character,String
Array,Dictionary,元祖类型(Tuple),可选类型(Optional)
---我们可以看出,数据类型首字母都是大写
如何定义常量或者变量的数据类型
let age:Int = 10
一般来说,没有必要明确指定数据的类型
如果,在声明变量、常量时,赋了初始值,swift可以自动推动该变量或者常量的类型
let age = 10
会推断出age是Int类型
9.变量的初始化
swift严格要求变量在使用之前初始化,不会像oc自动有默认值
整数
swift提供了特殊的有符号整数类型Int和无符号整数类型UInt
Int/UInt的长度和当前系统平台一样
在32位系统,Int和UInt都是32位
在64位系统,Int和UInt都是64位
建议
在定义变量时候,别总是考虑有无符号,数据长度的问题
尽量使用Int,这样可以保证代码的简洁,可复用性
浮点数
Double -- 至少精确到15位
Float -- 至少精确到6位
浮点数可以用十进制和十六进制表示
十进制(没有前缀)
没有指数:let d1 = 12.5
有指数:let d2 = 0.125e2
12.5 = 0.125 *10*10
十六进制(以0x为前缀,且一定有指数)
let d3 = 0xC.5p0
数字格式
可以增加额外的0,还可增加额外的下划线
let a = 100000
let b = 100_000
let c = 100
let d = 0100.00
10.类型转换
两个不同类型的数值不能相加
let num = 1
let num2 = 1.0
let sum = num + num2
上面代码第三行会错
解决
let sum = Double(num)+ num2
类型别名
可以使用 typealias关键字定义类型的别名,跟C语言的typedef作用类似
typealias MyInt = Int
给Int起个别名叫MyInt
元类型名称能用在哪儿,别名就能用在哪
let a:MyInt = 2
let minValue = MyInt.min
11.数组
如果定义数组时指定了保存对象的类型,择不能向数组中添加其他类型的内容
let 定义的数组是不可变的
var 定义的数组是可变的
// 数组中保存的都是字符串
let arr = ["zhangsan", "lisi"]
// 数组中保存的是 NSObject
let arr1 = ["zhangsan", 1]
// 添加元素
array.append("lisi")
//更新
array[0] = "zhangwu"
// 删除元素
array.removeAtIndex(1)
// 拼接数组
var array2 = [String]()
array2.append("1")
array2.append("2")
array += array2
12.字典
// 定义并实例化字典(这种类型是开发中常用的类型)
var dict = [String: AnyObject]()
//添加(更新)
dict["name"] = "zhangsan"
dict["age"] = 18
// 删除
dict.removeValueForKey("age")
// 合并字典
var dict2 = ["name": "wangwu", "age": 80, "title": "boss"]
for (k, v) in dict2 {
dict.updateValue(v, forKey: k)
}
13.元祖
元组(tuples)把多个值组合成一个复合值。元组内的值可以使任意类型,并不要求是相同类型。
let http404Error = (404, "Not Found")
// http404Error 的类型是 (Int, String),值是 (404, "Not Found")
println("The status code is \(http404Error.0)")
// 输出 "The status code is 404"
println("The status message is \(http404Error.1)")
// 输出 "The status message is Not Found"
你可以在定义元组的时候给单个元素命名
let http200Status = (statusCode: 200, description: "OK")
给元组中的元素命名后,你可以通过名字来获取这些元素的值:
println("The status code is \(http200Status.statusCode)")
// 输出 "The status code is 200"
println("The status message is \(http200Status.description)")
// 输出 "The status message is OK"
14.循环和遍历
//whlie
while false
{
}
//类似于do...while
repeat
{
}while false
// 循环
for var i = 0; i < 10; i++ {
print(i)
}
// 遍历 0 ~ 9(省略号之间不能有空格)
for i in 0..<10 {
print(i)
}
// 遍历 0 ~ 10(省略号之间不能有空格)
for i in 0...10 {
print(i)
}
// 特殊写法(如果不关心循环本身的索引,可以用通配符'_'忽略)
for _ in 0...10 {
print("hello")
}
数组遍历
var studentArr = [1,2,3,4,5,6,7,8,9]
for item in studentArr
{
print("item = \(item)")
}
//可以遍历数组中的所以和元素(间接用到了元组的特性)
for(index,value)in studentArr.enumerate()
{
print("index =\(index) value = \(value)")
}
/字典的遍历
var studentDic = ["姓名":"张三","爱好":"男""]
for (key,value)in studentDic
{
print("key = \(key) value = \(value)")
}
15.switch和枚举
//swtich(自带break,可以重复,但是找到一个就不会找第二个)
var name1 = "小明"
switch name1
{
case "小明":print(name1)
//要想要自带贯穿效果(重复之后也继续寻找)加fallthrough关键字
fallthrough
case "小明":print(name1)
//一定要包含所有条件
default: print("不存在")
}
//case可以写区间
var age1 = 12
switch age1 {
case 10...15:
print("a")
default:
print("默认")
}
//当age2 == 15成立的时候把age2赋给age
var age2 = 15
switch age2{
case let age where age2 == 15:
print("age = \(age)")
default: break
}
//遍历元祖
var studentTuple = (姓名:"张三",性别:"男",年龄:12)
switch studentTuple
{
case ("张三","男",12):
print("找对了")
case (_,_,12):
print("找对了")//只要一个条件成立就可以进
default:
break
}
*枚举
//枚举(和oc一样默认初始值是0,如果修改初始值的话需要制指定类型,swift的枚举创建必须要带case)
enum season :Int
{
case spring = 2
case summer
case autumn
case winter
}
print(season.autumn)
//打印枚举值的值
print(season.autumn.rawValue)
var today = season.summer
//筛选枚举
switch today
{
case.spring:print("春天")
case.summer:print("夏天")
case.autumn:print("秋天")
case.winter:print("冬天")
}
16.函数
//函数
//无参无返回
func func1()
{
print("无参无返回值")
}
//无参有返回
func func2()->String
{
print("无参有返回值")
return "小明"
}
//有参无返回
func func3 (a :String)
{
print("有参无返回值")
}
//有参有返回
func func4 (a:Int)->String
{
print("有参有返回值")
return String(a)
}
//函数调用
func1()
func2()
func3("123")
func4(1)
//返回值是多个参数
func func5()->(Int,String)
{
return(1,String(123))
}
17.结构体
我们通过关键字 struct 来定义结构体:
struct nameStruct {
Definition 1
Definition 2
……
Definition N
}
我们定义一个名为 MarkStruct 的结构体 ,结构体的属性为学生三个科目的分数,数据类型为 Int:
struct MarkStruct{
var mark1: Int
var mark2: Int
var mark3: Int
}
我们可以通过结构体名来访问结构体成员。
结构体实例化使用 let 关键字:
struct studentMarks {
var mark1 = 100
var mark2 = 78
var mark3 = 98
}
let marks = studentMarks()
print("Mark1 是 \(marks.mark1)")
print("Mark2 是 \(marks.mark2)")
print("Mark3 是 \(marks.mark3)")
以上程序执行输出结果为:
Mark1 是 100
Mark2 是 78
Mark3 是 98
18.类
Class classname {
Definition 1
Definition 2
---
Definition N
}
定义一个类
class student{
var studname: String
var mark: Int
var mark2: Int
}
创建一个实例的语法:
let studrecord = student()
class studentMarks {
var mark = 300
}
let marks = studentMarks()
println("Mark is \(marks.mark)")
输出:
Mark is 300