//1、基本运算符就是加减乘除和取余等操作;

//2、基本逻辑运算符就是与&、或||、非!,要注意Swift中的逻辑运算符必须为严格的Bool类型;

//3、比较运算符就是用于两个操作数之间的比较运算,会返回一个Bool类型的逻辑值。==、>=、<=、!= 、> 、<,注意在Swift中对于元组的比较操作的原则:首先要保证元组中元素的个数和对应位置的元素类型必须相同,其次元组中的每个元素必须支持比较运算符,比如如下代码:

var tp1 = (1,4,"5")
var tp2 = (2,6,"9")
var tp3 = ("1",4,6)
tp1 < tp2
//tp1 < tp3

//tp1<tp2 返回为true,tp1和tp3没法比较,会直接报错

//4、条件运算符,又称为三木运算符,是一种三元运算符,比如  m>n?m:n 等同于一个if-else代码块

/*5、Swift中的两个特殊的运算符:

     a.空合并运算符

     可选值类型(Optional)是Swift语言的一个独特之处,主要是针对可选类型而设计的运算符。

     Swift可以使用空合并运算符"??"来处理Optional类型值得条件选择结构

    */

var q:Int? =8
var value1:Int
value1 = q ?? 0

//??是一个二元运算符,需要两个操作数,第一个操作数必须为Optional值,如果Optional不为nil,则将其进行拆包操作,并作为空合并运算的运算结果;如果Optional值为nil,则将第二个操作数作为空合并操作数的结果返回

 /*

     b.区间运算符

     Swift中除了支持Range结构体来描述范围外,还提供了一个区间运算符来直观的表示范围

     比如 >=0&<=10,可以表示为 0...10

         <=0&<10,可以表示为 0..<10

      同时还可以使用 ~= 运算符来检查某个数字是否包含在范围中,比如:

 */

var range = 0...10

print(range ~=8)//判断range中是否包含8,显然返回true

//注意,在for-in循环结构中,如果in关键字后面是一个集合,则变量index会自动获取集合中的元素;如果in后面是一个范围,则index获取到的是从左到右一次遍历到的范围索引数

//循环结构,Swift主要提供了for-in遍历、while和repeat-while三种循环结构。

//1、for-in循环,在C/OC中支持的for-in循环被称为快速遍历,用来进行的操作将是无序的,而Swift中的fir-in循环不仅可以进行无序遍历,还可以进行有序的循环遍历,另外在Swift2.2以上的版本去除了“++”和“--”运算符。如果在进行for-in循环遍历的时候,开发者并不需要捕获到的值可以使用匿名参数来进行接收,Swift中使用"_"符号来表示匿名参数,比如:

var sum = 0
for _ in 0...5 {
    sum += 1
}
print(sum)

//对于集合的遍历是for-in循环的最常用的场景之一,比如

var collection1:Array = [1,2,3,4]
var collection2:Dictionary = [1:1,2:2,3:3,4:4]
var collection3:Set = [1,2,3,4]
for obj incollection1 {
    print(obj)
}
for dic incollection2 {
    print(dic.value)
}
for set incollection3 {
    print(set)
}

//2、while与repeat-while条件循环

//条件选择与多分支选择结构

//1、if与if-else,注意,在Swift中if关键字后面的条件必须为严格意义上的逻辑值或者结果为逻辑值的表达式

//2、switch-case多分支选择结构,switch被称为开关选择语句,在C/OC中的switch语句只能进行int类型值得匹配,而在Swift中 的switch语句可以进行任意数据类型的匹配,并且case子句的语法和扩展都更加灵活。并且一个case语句匹配成功后,会自动跳出switch结构,如果不加处理,switch结构中的分支只会被执行一个或者一个也不执行

var char = "c"
switch char {
case "b":
    print("b")
case "a":
    print("a")
default:
    print("不匹配")
}

//也支持在一个case子句中编写多个匹配条件,比如:

switch char {
case "1","2","3":
    print("1,2,3")
case "a","b","c":
    print("a,b,c")
default:
    print("不匹配")
}

//在元组中的使用,首先,对于元组类型参数的匹配,比如:

var tuple = (0,0)
switch tuple {
case (0,1)://完全匹配
    print("sure")
case (_,1)://选择性匹配
    print("sim")
case (0...3,0...5)://范围匹配
    print("SIM")
    
default:
    print("")
}

//另外在case子句中还可以捕获switch元组的参数,在响应的case代码快中可以直接使用捕获到的参数

switch tuple {
case (let a,1)://对第一个元素进行捕获
    print(a)
case (let b,0)where b == 0://意为当两个值都为0时才匹配成功,并且捕获第一个元素的值
    print(b)
case let(a,b)://捕获元组中的两个元素
    print(a,b)
default:
    print("NO")
}




//Swift中的跳转语句,常见的有:continue、break、fallthrough、return、throw、guard

//1、continue,用于循环中,其作用是跳过本次循环,直接开始下次循环,并不会跳出本次循环

//2、break,中断语句,可以使用在循环结构中,和continue不同的是,break语句会直接中断直接包含它的循环结构。如果是多层循环结构时,会中断当前层的循环结构

//3、fallthrough,Swift中特有的一种 流程控制语句,在Swift中的switch-case结构中匹配到一个case后会自动中断后面的case的操作,如果实际开发中,我们不需要中断操作,就可以使用fallthrough语句

switch tuple {
case (0,0):
    print("sure")
    fallthrough
case (_,0):
    print("sim")
    fallthrough
case (0...3,0...3):
    print("SIM")
    fallthrough
default:
    print("default")
}




//上面的代码会执行所有的case代码块

//4、return,在函数中用于返回结果值,也可以用于提前结束无返回值类型的函数,另外,在闭包中也可以使用return进行返回

//有返回值
func myfunc()->Int{
    return  100
 }
 //无返回值
func
    return
 }
print(myfunc())

//5、throw 语句用于异常的抛出,throw语句抛出的异常不进行捕获处理,就会中断程序:

enum myError:Error{
case
case
 }
func newFunc() throws{
 //    抛出异常
    throwmyError.errorone
 }

//5、guard-else是Swift2.0新出的语法结构,目的在于使代码和逻辑更清晰,实际开发会遇到这样的场景:当参数满足某个条件时,函数才能正常执行,否则直接通过return来终止函数的执行

func myfunc2 (num:Int){
if num <= 10
return
     }
print(num)
 }
 //或者
func myfunc3(num:Int){
if num < 10
print(num)
     }
 }

//上面的两种写法还有一些问题,如果这个函数中需要做的操作很多,那所有条件判断的代码都将写在if语句块中,这样代码就显得杂乱无章,guard-else就是优化这种情况的,guard-else语句也称为守护语句,作用就是确保某个条件成立才允许其后的代码执行,

func myfun4(num:Int){
guard num>10else{
return
     }
print(num)
 
 }
 /*打印
  **********
  *????????*
  *????????*
  **********
  */

for row in 1...4 {
    print("")
    for ver in1...10 {
        if row==1||row==4 {
            print("*",separator:"",terminator:"")
        }
        else{
            if ver==1||ver==10 {
                print("*",separator:"",terminator:"")
            }
            else{
                print("?",separator:"",terminator:"")
            }
        }
        
    }
}




//print(_:separator:terminator:) 是一个用来输出一个或多个值到适当输出区的全局函数。separator 和 terminator 参数具有默认 值,因此你调用这个函数的时候可以忽略它们。默认情况下,该函数通过添加换行符来结束当前行。如果不想换 行,可以传递一个空字符串给 terminator 参数--例如, print(someValue, terminator:"")