Swift简述
苹果公司于2014年WWDC发布的新开发语言Swift,可与OC共同运行于Mac OS 和iOS平台,用于搭建基于苹果平台的应用程序.
声明变量和常量
在Swift中使用”let”修饰常量,使用”var”修饰变量.
在声明常量和变量的时候可以使用表情符号,中文等命名常量名和变量名.
//当需要导入类库名时,使用import类库名形式进行导入
import Foundation
//swift 使用print输出
print("Hello, World!")
/*
/*
*/
*/
//******************************
//1,定义
//显示声明类型:在冒号 :后面书写常量或变量的类型
//可以不显示的声明变量或常量,swift语法中有类似推断机制,可根据该变量或常量的值,来判断他的类型
let a:Int =5 //常量, let修饰,程序运行期间值不变
let b:Int =4;let c:Int =8
var d:Int =4 //变量, var修饰,程序运行期间值可以发生变化
let 春天 =4 //变量名可以用中文,表情符号等,但是,不建议
print(春天)
print("春天 =\(春天)")
//二进制
var twoValue = 0b1000000
print(twoValue)
//八进制
var eightValue = 0o11
print(eightValue)
//十六进制
var sixteenValue = 0x11
print(sixteenValue)
//浮点型 ********************************************************************************
//会吧浮点型判断为 Double类型,所以如果是float类型,需要使用显示声明
var floatValue = 22.3
print(floatValue)
//BOOL 类型***************************
//Swift 中 BOOL类型的值:只有 true和 false没有其他值
var isTrue:Bool =true
if isTrue {
print("十六")
}
//Swift 新增的类型**********************
//元组(多个不同类型或者相同类型的值组成),一班结合函数使用
//一,元组定义
//方法一,显示标识出元素的类型
let classNews:(String,Array) = ("yuanzu", ["a","b","c"])
//方法二,直接初始化一个元组,通过隐式推断让系统确定每个元素的类型
let newsClass = ("gdgagae4rga4w3", ["d"])
//二,元组访问
var httpCode = (des:"successful", value:333)
//1, 根据下标访问元组中的元素
print(httpCode.0)
//2, 根据描述信息访问元组中的元素
print(httpCode.value)
//可选类型******************************************************************
//可选类型单独使用的场景较少,会结合构造方法(OC的初始化方法)来使用,Swift中构造方法有一个安全性原则:每个类创建出来的对象,每个对象的每个属性都要有默认值
//此时可选类型就是很好的选择,因为当外界不赋初值时,它的值为nil
//在Swift中, nil代表一个确切的值,是个值类型,而OC中,nil代表一个空指针,是一个引用,
var optionalValue:Int? =3
if var opt2 =optionalValue {
print(opt2)
}
//断言*********************************************************************
//对于程序来说,断言没什么作用,只是方便程序员调试bug
var age = 2
assert(age >0,"")
//运算符*******************************************************************
//一,一元运算符
//负号运算符
var fuValue = 23
var fuValue2 = -fuValue
//正号运算符
var zhegnValue = 3
var zhengValue = +zhegnValue
//二,二元运算符
//取余运算符:在Swift中取余运算符两端可以为浮点型数据
var remValue = 12.9 %3
print(remValue)
//三,三元运算符 ? :
//四, Swift新增的运算符
//(1)区间运算符
//... 包含两端的值
//..< 不包含 <后面的值
//
for i in1..<10 {
print(i)
}
//(2)空合运算符
//综合可选类型使用
/*
注意:
1, ?? 前面必须使用可选类型呢
2, ?? 前后的类型必须一致
*/
var opt:Int! =3
var kongheValue = opt ??23
print(kongheValue)
//字符串****************************************************
/*
Swift中新增的字符串类型String,除了新增的还可以使用OC中的NSString
String类型的字符串是值类型
String本身没有可变和不可变之分,是否可变取决于使用var还是 let来修饰
对于复杂的字符串,比如截取,等,建议使用OC的字符串
*/
//一, Swift中字符串String
//1, 定义字符串变量
var varString = "hello world"
var varString2:String ="gdsaga"
//2, 创建空字符串变量
var emptyStr = ""
var emptyString = String()
//3, 判断字符串是否为空
if emptyStr.isEmpty {
print("字符串是空的")
}
//4, 字符串拼接
var string1 = "nihao"
var string2 = "漂亮"
var string3 = string1 +string2
print(string3)
//5, 截取
var index = string1.startIndex.advancedBy(4)
string1 = string1.substringToIndex(index)
print(string1)
//二,使用OC的字符串
//1, 创建
var OCString:NSMutableString =NSMutableString(string:"nizhen")
print(OCString)
//2, 使用OC方法进行拼接
OCString.appendString("漂亮")
print(OCString)
//3, 使用OC方式进行截取
var subString = OCString.substringToIndex(2)
print(subString)
//数组****************************
/*
Swift中数组是值类型,OC中的数组是引用类型
Swift数组本身没有可变和不可变之分,是否可变取决于使用var还是 let来修饰
*/
//一, Swift数组
//声明一个数组
var carArray = ["你","好","漂","亮"] //最常用方式
var nameArray:Array = ["a","b","c","d"]
//声明空数组
var intArray = []
var intArr = [Int]()
var intArra:[Int] = [Int]()
var array = Array<String>()
var array1:Array<Int> =Array<Int>()
//数组操作
var swiftArray = ["你hao","漂亮",23 , 4,44]
//1, 添加元素
swiftArray += [54,"dg"]
print(swiftArray)
//2, 插入元素
swiftArray.insert("真烦", atIndex:3)
//3, 删除元素
swiftArray.removeAtIndex(4)
//4, 改
//(1) 根据下标修改
swiftArray[3] ="xia"
//(2) 利用区间运算符修改
//注意,如果修改时,区间上的值比较多,相当于是用后面数组中的元素,替换原数组中对应位置的值
swiftArray[1...2] = ["dsg"]
//5, 数组查询
//(1) for 循环
for var i =0; i <swiftArray.count; i++ {
print(swiftArray[i])
}
//(2) for in
for i inswiftArray {
print(i)
}
//二,使用OC中数组
var OCArray:NSMutableArray =NSMutableArray()
//1, 增
OCArray.addObject("a")
//2, 插入
OCArray.insertObject("HHH", atIndex:0)
print(OCArray)
//3, 删除
OCArray.removeObjectAtIndex(0)
//4, 修改
OCArray.replaceObjectAtIndex(0, withObject:"b")
//****************************字典****************************
/*
Swift 中的字典也是值类型,OC中的字典是引用类型
Swift字典本身没有可变和不可变之分,是否可变取决于使用var还是 let来修饰
*/
//一,声明方式
var swiftDic = ["name":"qwe","age":33]
var initSwiftD:Dictionary<String,Int> =Dictionary()
//1, 增加元素
swiftDic["address"] ="换"
//2, 删除
swiftDic.removeValueForKey("address")
//3, 修改
swiftDic["age"] =34
//updateValue 方法,可以修改数据或者插入数据,当key值存在时,就是修改操作.当key值不存在,是插入操作
swiftDic.updateValue("age", forKey:"name")
//4, 查询
//利用元组遍历字典
for (key, value) inswiftDic {
print(value)
}
//二,使用OC中字典
var OCDic = NSMutableDictionary()
//1, 增加键值对
OCDic.setObject("hehe", forKey:"name")
//2, 更新
OCDic.setObject("", forKey:"")
//3, 移除
OCDic.removeObjectForKey("")
//4, 查询
//控制流********************************************************'
//分支
//if ... else
//结合关系表达式使用
if 4 >3 {
print("22")
} else {
}
//switch ... case
/*
Swift 中swith得到强化,但是需要注意:
1, default 分支不能省,且需要些在最后面
2, 每个分支至少一句代码
3, 分支要包含所有的情况
强化部分:
1, 分支后没有break,但不会贯穿
2, case分支后可以为一个区间等
*/
var number = 5
switch number {
case 1...4:
print("s")
case 5,6,7,8:
print("f")
fallthrough//通过 fallthrough关键字实现分支之间的贯穿
default:
print("")
}
let ageKey = 3
switch ageKey {
case var valuewhere ageKey <10 &&ageKey >1:
value += 11
print(value)
default:
print("")
}
//关键字是元组可以在分支中进行判断
//"_",代表忽略
let point = (x: 10, y:10)
switch point {
case (_,10):
print("case1")
case (10,0):
print("case2")
case (10,10):
print("case3")
default:
print("case4")
}
//循环***********************************************************
//注意:for循环在Swift 3之后可能会禁用
//for循环 , for in
//while 循环
var whileNum = 0
while whileNum <3 {
print("")
whileNum +=2
}
//repeat ... while
repeat {
print("")
} whilefalse
//标签语句
//应用场景:循环嵌套
//作用:准确的取消某一个循环的执行
//如果想要取消那个循环,就给这个循环起一个标签,在合适的时机 break该标签,就能实现终止的效果
xue:whiletrue {
for iin1...4444 {
print("")
if i ==4 {
break xue
}
}
}
//枚举****************************************************************
enum Fruit:Int {
case Apple
case Banana
case Orange
}
//获取原始值
print(Fruit.Banana.rawValue)
//获取哈希值
print(Fruit.Banana.hashValue)
enum season:String {
case Spring ="春"
case Summer ="下"
case Autumn ="求"
case Winter ="懂"
}
//获取原始值rawValue
print(season.Summer.rawValue)
//获取哈希值:Swift在背后实际上使用哈希值来识别枚举的符号(Spring等)的
//函数*****************************************************************************
/*
函数其实就是方法
语法结构:
func 函数名(参数类表) ->返回值 {
语句
}
参数形式:参数名:参数类型
多个参数之间用 ,隔开
Swift 中的文件格式中没有类似于OC中的.h文件,所以,如果需要定义一个私有的函数,可以在func 前添加 private 修饰即可
*/
//***************无参无返回值
func sayHello() {
}
//函数调用
sayHello()
//***************有参无返回值
func printPersonName(name:String) {
print("name =\(name)")
}
//调用
printPersonName("水木年华")
//***************有参有返回值
func sumValue(a:Int, b:Int) ->Int {
return a + b
}
//调用
var sum = sumValue(3, b:4)
print(sum)
//***************无参有返回值
func giveMoney() ->Int {
return33
}
//调用
var money = giveMoney()
print(money)
//多个参数多个返回值---返回值用元组
func returnPersonInfor(name:String, gender:String, age:Int) -> (String, String,Int) {
return (name, gender, age)
}
//调用
var (name, sex, perAge) = returnPersonInfor("花铁杆", gender:"男", age:19)
print(name,sex, perAge)
//使用函数时:
//1, 参数在默认情况下是let类型,在函数内部只能使用,不能重新赋值
//2, 如果想在函数中给参数赋值,在参数前加var 声明(Swift 3之后将被禁用)
//3, 如果想在函数内部修改参数值,同时引起函数外部的变量的值发生变化,此时在参数前加 inout修饰(类似于 C语言中传地址的操作)
func exchangeValue(inout a:Int,inout b:Int) ->Void {
let temp = a
a = b
b = temp
}
var first = 3
var second = 5
exchangeValue(&first, b: &second)
print(first,second)
//***************函数高级*******************************************************
//和
func addValue(a:Int, b:Int) ->Int {
return a + b
}
//差
func subValue(a:Int, b:Int) ->Int {
return a - b
}
//一,函数作为参数
func getValue(funcName:(Int,Int)->Int, a:Int, b:Int) ->Int {
return funcName(a, b)
}
//调用
var value = getValue(subValue, a:3, b: 5)
print(value)
//二,函数作为返回值
func getFunction(isAdd:Bool) -> (Int,Int)->Int {
return isAdd ?addValue : subValue
}
//调用
var fun = getFunction(true)
var funValue = fun(4,3)
print(funValue)