一、变量、常量



1、Swift中分别使用let、var来定义常量与变量的。


2、Swift在定义常量或变量时,必须指定其数据类型。


格式:let a:Int = 10 (变量名 : 数据类型) 其含义是:定义了一个Int类型的常量,值为10,且不能做修改


注:Swift编译时,是通过空格或回车符来断句的,所以使用Swift语言书写的代码只要回车就行,不用以分号结束。


如果定义常量的格式为 let a = 10 其也可以执行,并不会报错,因为Swift语言会根据初始值自动推断出自己是什么类型的数据或常量(具备隐式推断的功能)


3、使用var来定义我们的变量,变量可进行重新赋值操作


如:var a = “lianxi"


       var b = “duoqiao"


以上分别定义了两个字符串类型的变量,那么我们如何来拼接它们呢?


       var c = a + b


Swift语言拼接字符串可以直接相加,它会隐式判断出你所要进行的操作,但是如果遇到两个不同数据类型的加减乘除的话,它会报错,其不支持隐式类型转换,必须提前进行显示转换成相同数据类型


     var d = 3


     var e = a + String(d)     //提前将Int类型的d显示转换成String类型




4、在定义变量的时候,在数据类型后面加?表示该变量可以为nil      例如:  var a : Int? = nil


5、在Swift中Bool类型是一个结构体,不是枚举,只有两种结果:ture 和 false ,所以不能通过以前的非0为真去判断Bool的真假


     var bool = ture




注:Swift中的变量输出为:print( \( 变量名 ) )




二、数组


1、Swift 中分别使用let和var去定义一个不可变的数组和可变的数组(使用[ ]来表示定义了一个数组)


数组的定义与定义常量和变量一样,有两种定义方式:1)定义初值,系统自动推断;2)变量后面加 :类型名


特别地:如果定义成:var array = [ 1,  2,  “a”]   根据系统特性:数组中的元素必须是同一数据类型的;那么系统推断的数组元素类型为NSObject


     var array : Array<Int> = [ 1, 2, 4]   //数组中的元素只能是Int类型的


     var array : [ Int ] = [ 1, 3 ,5 ]  等同于以上格式


2、数组跟C中的一致,也是通过下标来访问数组元素的


3、数组可通过相加来拼接数组,也可通过点语法来添加和移除数组元素(最后添加、指定位置添加、指定位置移除、移除全部元素)


4、数组里面添加数组元素




三、字典  (也是[ ]来表示)


1、定义字典格式: let/var 字典名 = [key : value, key : value ]


如果字典是通过定义初值的方法去定义,里面的key和value数据类型可以不相同


而字典通过指定类型来定义,里面的key和value数据类型不可改变


var dictionary : [ Sting : Int ] = [ “a” : 1, “b” : 2]


2、字典也可以创建一个可以为nil的字典,也是用?修饰


而通过?修饰的变量在使用的时候,必须在变量名后面添加!来进行拆包读取


dictionary![“a”] = 100    (通过key值读取并做修改)




四、元组 (Swift中新增类型)


元组定义时是用()来表示的


元组的元素可以通过下标定义和读取,也可以通过key/value定义和读取


元组定义时给定元素类型使用()


注:若果使用指定类型定义,元组里面的元素相同,也必须每个元素对应一个类型


它的读取与字典和数组不同,不用使用【】,而是直接使用点语法 :元组名 .下标  或 元组名 . key




五、分支语句


     if 判断与OC中的区别不大,有两点改变:1)条件可不用加括号;2)条件必须写全,如:bool == ture


     区间条件:…和..<


     …代表从0开始到最后一位,包含最后一位的值


不包含最后一位的值


     switch分支


     与OC中switch相比:1、每一个分支不用加break,系统会默认添加


                                       2、每一个分支都必须写东西,不能为空


                                       3、可以使用fallthrough来贯穿执行两个分支代码


                                       4、可以对一个区间条件进行匹配使用


                                       5、可以搭配一个元组一起使用(使用_来忽略某一个条件)


                                       6、可以使用where来作为判断条件




六、循环语句


     for; for…in ;   while; repeat…while(代替了do...while)


    基本语法与OC与类似,是有一点改变,条件的括号可以省略不写


七、函数


     Swift中的函数有以下几个不同于OC函数的特点:


     1、使用元组可实现有多个返回值的函数


Swift中,一个参数有两个名字,内部参数名和外部参数名


         内部参数名:在函数内部使用的参数名称。



         外部参数名:在函数调用时候,显示的参数名称



     3、在函数内部是不能修改参数值的,因为它是默认使用let来定义的,如果需要修改,需要手动使用var来定义



     4、默认情况下,多参数函数的第一个参数名,不在外部显示,其他参数的外部参数名与内部变量名一致,如果不想让它们在外部显示,可以在定义参数名前加_来忽略外部参数名



     5、Swift中定义的函数里面还能定义函数(函数能够嵌套定义)



另外:inout参数:
1.参数默认是用let修饰,即常量
2.在参数前面添加var,就可以在函数内部修改参数的值,但不能改变实参变量的值.



3.如果参数使用inout来修饰,就成了输入输出参数,在函数内部修改参数,可以影响实参变量的值.








     函数只是一个格式的转变:各种代码格式如下:


//Swift里面的函数是一个变量
 //无参数无返回值  ( -> Void 可省略不写)
 //定义函数的格式:
 //func (关键字)  test(函数名)(参数)->返回值类型
 //{
 //    函数体
 //}
 //如果没有返回值,  -> Void 可以省略
func  test() -> Void  {
     print("我是一个无参数无返回值的函数")
 }
//调用函数
test()

//无参数有返回值
func  test1() -> String  {
    
     return  "a"
 }
print(test1())

//返回一个OC的数组类型
func  test2() -> NSArray  {
    
     return  [2,3, 4]
 }
print(test2())

//返回一个Swift的数组类型
func  test3() -> Array<NSObject> {
    
     return  [1,2, "33"]
 }

print(test3())

//Swift中可以返回多个返回值,其实就是返回一个元组
func  test4() -> (String,Int,Int,Array<NSObject>) {
    
     return  ("a",10,10, [1,2])
 }
print(test4())

//有参数无返回值
func  test5(name : String, age :Int) {
    
     print(name, age)
 }

test5("你猜", age: 12)

//定义一个参数是数组类型的函数
func  test6(people : Array<NSObject>) {
    
     print(people)
 }
test6([1,2, 3,  "33"])

//Swift中含有内部参数名和外部参数名
 //下面的函数中  你好 是外部参数名
 //           nicai 是内部参数名
func  test7(你好  不好:String) {
    
     print(不好)
     print("你好不好")
 }
test7(你好:"你也好")

//如果不想让外界知道你的外部参数名,可以使用_忽略掉外部参数名,每个参数都会自带一个外部参数名的,如果不写则和内部参数名一致
func  test8(name: String, age :Int){
    
     print("name =\(name), age =\(age)")
 }

//test8(<#T##name: String##String#>, age: <#T##Int#>)

//在函数内部是不能修改参数值的,因为每一个参数是默认使用let定义的
 //如果需要修改的话,可以手动的使用var定义参数
func  test9(var  name : String) {
    
     name = "a"
 }

//inout修饰的函参数,是var定义的,在使用的时候可以改变传进来的参数的值
func  test10(inout  name : String) {
     name = "韩一路"
 }

var  name = "过冬"

test10(&name)

print(name)


func  test11(inout  people : (String,String)) {
    
     let  temp = people.0
     people.0  = people.1
     people.1  = temp
    
 }

var  since = ("100","500")

test11(&since)

print(since)


func  test12(name : String, age :String) ->String
 {
     let  string = "我叫\(name),今年\(age)岁"
     return  string
 }

let  string = test12("刘永杰", age: "25")
print(string)

func  test13(people : (String,Int)) ->Array<String>
 {
     return  ["我叫\(people.0),今年\(people.1)岁"]
 }

let  array = test13(("刘永杰",25))
print(array[0])

//函数里面可以嵌套定义一个新的函数,可以无限地循环下去
func  test14() {
     func  test1() {
         func  test2(){
            
         }
     }
     func  test2() {
         func  test1() {
            
         }
     }
    
 } 
test14()