swift基础语法练习

时间:2021-03-04 22:24:00
import UIKit

var str = "Hello, playground"

var num = 5
num += 5

class person {
    var name = "zhangshanshan"
    var address = "上海市浦东新区"
    var age = 5

    func updateInfo(age : Int , address : String) {
        print(name,age,address)
    }
}

let obj = person()
obj.updateInfo(age: 8, address: "河南郑州")

var str2  = "hello"
print(str2)

var abool = true
print(abool)

let num2 : Int = 5
if num < num2 {
    print(num2)
}
else {
    print(num)
}

switch num2 {
case 5:
    print(1)
default:
    print(num2)
}

var i = 11
repeat {
    print(i)
    i += 1
} while (i <= 15)

for i in 1...10 {
    print(i)
}

for i in 1..<10 {
    print(i)
}

var middleName: String? = ""
//不能对nil进行解包
var anotherName: String = middleName!

func printHello() {
    print("hello world")
}

printHello()
printHello()

func printNum(num:Int,age:Int,name:String) {
    print("name:\(name),age:\(age),num:\(num)")
}

printNum(num: 5, age: 18, name: "nannan")

func maxNum(num1:Int,num2:Int) -> Int {
    if num2 > num1 {
        return num2
    }
    else {
        return num1
    }
}

maxNum(num1: 5, num2: 12)

/*
 guard的使用(重点)—>判断一个人是否可以上网
 —-> 1>任何用if的地方都能用guard,反之也成立.但是guard可以提高代码的可读性,比if好用
 —-> 2>guard语句必须带else
 —-> 3>guard的使用
 —-> 3.1 如果条件表达式为真,则会执行后面的语句
 —-> 3.2 如果条件表达式为假,则会执行else后面的{}语句
 —-> 4 >补充(guard在国内翻译为:守卫)
 */
let age = 20
//函数
func onLine(age : Int ,hasIdentity:Bool ,hasComputer : Bool){
    //判断一
    guard age > 18 else{
        print("年龄不够,不能上网")
        return
    }
    //判断二
    guard hasIdentity else{
        print("无身份证,不能上网")
        return
    }
    //判断三
    guard hasComputer else{
        print("没有电脑,不能上网")
        return
    }
    print("开机上网")
}

onLine(age: 20, hasIdentity: true, hasComputer: true)


/*
 —-> 5.1 switch后面的()可以省略
 —-> 5.2 case结束后可以不加break,系统会默认跟上break
 */
//switch在swift中的使用(一)--->switch后面的括号可以省略,可以不加break,系统会默认跟上break
let a = 9
switch a {
case 10:
    print("等于10")
case 11:
    print("大于10")
case 9:
    print("小于10")
default :
    print("其它")
}
//—-> 5.3 switch基本用法的补充 1> case后面跟多个条件 2>如果case中希望产生case穿透,可以使用fallthrough
//switch在swift中的使用(二)--->如果希望产生穿透,直接使用fallthrough
//0 = 男; 1 = 女
let b = 1
switch b {
case 1:
    print("女")
case 2:
    print("男")
    fallthrough;
default:
    print("其它")
}
//switch在swift中的使用(四)--->case后面可以跟上多个条件
let e = 0
switch e {
case 0,1:
    print("人");
default:
    print("其它")
}
//—-> 5.4 swift支持浮点型
//switch在swift中的使用(四)--->支持浮点型
let c = 1.2
switch c {
case 1.2,1.3:
    print("人")
default:
    print("其它")
}
//—-> 5.5 swift支持字符串类型
//switch在swift中的使用(三)-->支持字符串类型
let mystr = "测试字符串"
switch mystr {
case "测试":
    print("测试就是两个字!")
case "字符串":
    print("字符串能吃吗?")
case "位置":
    print("不知道耶。。")
case "测试字符串":
    print("终于对啦!")
default :
    print("默认值")
}
//—-> 5.6 swift支持区间类型(区间指的是:数字之间的区间)
//switch在switf中的特殊用法-->支持数字区间
let score = 80
switch score {
case 0 ..< 60:  //[0 60)
    print("不及格")
case 60 ..< 80: //[60 80)
    print("及格")
case 80 ..< 90: //[80 90)
    print("良好")
case 90 ... 100://[90 100]
    print("优秀")
default:
    print("分数不合法")
}

/*
 循环-3种
 */
//1-swift中的循环写法(一)-->注意: "..<"是一块的,中间不能隔开
for i in 0 ..< 10 {
    print(i)
}

//2-swift中的循环写法(二)-->注意: "i++{"这样挨着写就会报错 -- SWift3已废弃
//for var i = 0; i < 10; i++ {
//    print(i)
//}

//swift中的循环写法(三)-->如果中间的i并没有起到作用,可以用下划线代替
for _ in 0 ..< 10{
    print("hellow world")
}

//while
var aa = 13
while(aa > 2) {
    print("aa = \(aa)")
    aa -= 2
}
//swift中的while使用(二)
//OC中的do改为repeat
var cc = 13
repeat {
    print("cc = \(cc)")
    cc -= 2
}while cc > 0

/*字符串*/
var myStr = "adsdsd12"
let length = myStr.characters.count
print("myStr长度是\(length)")
//遍历字符串中所有的字符
for d in myStr.characters {
    print("myStr的字符\(d)")
}
//字符串的拼接 1>两个字符串之间的拼接2>字符串和其它标识符之间的拼接
//字符串的拼接(一)
let str01 = "xiaofeng"
let str02 = "肖锋"
let str03 = str01 + str02//直接采用加法
print(str03)
//字符串和其它标识符之间的拼接
let name01 = "肖锋"
let age02 = 19
let height03 = 1.88
//拼接
let togetherInfo = "my name is \(name01),age is \(age02), height is \(height03)"
print(togetherInfo)
//字符串的格式化
let totalSecond = 64
let min = totalSecond / 60
let second = totalSecond % 60
let timeString = String(format: "min: %02d second :%02d", arguments: [min, second])
print(timeString)
//字符串的截取 1>将string类型转成NSString类型  2>swift的截取方式
//—-> 7.1 字符串的截取--->需要先将String类型转为NSString类型(String as NSString)
var urString = "www.baidu.com"
let urlStr1 = (urString as NSString).substring(from: 2)
let urlStr2 = (urString as NSString).substring(to: 10)
//截取中间部分
let range = NSMakeRange(4, 5)
let middle = (urString as NSString).substring(with: range)

//定义一个数组
//—-> 1.1 定义不可变数组:使用let修饰
let array = ["adc"]
print("array:\(array)")
//—-> 1.2 定义可变数组:使用var修饰
var array1 = ["adf"]
array1 = ["aefgg"]//合法的
print("array1:\(array1)")
//对可变数组的基本操作(增删改查)
//—-> 2.1 增
var array2 = ["xiaofeng"]
array2.append("nb")
array2.append("it")
//—-> 2.2 删
var array3 = ["xaiofeng"]
array3.remove(at: 0)
print("array3:\(array3)")
//—-> 2.3 改
var array4 = ["xiaofeng"]
array4.append("nb")
array4[1] = "it"
print("array4:\(array4)")
//—-> 2.4 查
//获取某个下标对应的元素
var array5 = ["xiaofeng"]
array5.append("it")
array5[0]
print(array5[1])

//遍历数组(四种方式)—>方式二和方式三比较常见
//—-> 3.1 方法一
var array6 = ["xaiofeng"]
array6.append("it")
array6.append("nb")
for i in 0 ..< array6.count {
    print(i)
    print(array6[i])
}
// —-> 3.2 方法二
var array7 = ["xaiofeng"]
array7.append("it")
array7.append("nb")
for name in array7 {
    print(name)
}
//—-> 3.3 方法三
var array8 = ["xaiofeng"]
array8.append("it")
array8.append("nb")
for (index, name) in array8.enumerated() {
    print(index)
    print(name)
}
//—-> 3.4 方法四
var array9 = ["xaiofeng"]
array9.append("it")
array9.append("nb")
for name in array9[0 ..< 3] {
    print(name)
}

//4 数组的合并(如果两个数组的类型一致,那么可以相加进行合并)
let name1 = ["xiaofeng","it"]
let name2 = ["nb"]
let name3 = [18,18.9]

let names = name1 + name2
//let names1 = name1 + name3//类型不一致,不能相加合并

//定义字典
//—-> 1.1 定义不可变字典:使用let修饰
let dict = [
    "name":"xiaofeng",
    "age":"18",
    "height":180
] as [String : Any]
//dict = ["career":"it"] 不可变字典,不能修改
//—-> 1.2 定义可变字典:使用var修饰
var dict1 = [String:AnyObject]()
//对可变字典的基本操作(增删改查)
//—-> 2.1 增
var dict2 = [String:AnyObject]()
//添加元素
dict2["name"] = "xiaofeng" as AnyObject?
dict2.updateValue(18 as AnyObject, forKey: "age")
//—-> 2.2 删
dict2.removeValue(forKey: "age")
//—-> 2.3 改
dict2["name"] = "xiao" as AnyObject?
dict2
dict2.updateValue("xiaofeng" as AnyObject, forKey: "name")
dict2
//—-> 2.4 查
dict2["name"]
//遍历子字典(三种)
//—-> 3.1 第一种
for key in dict2.keys {
    print(key)
}
// —-> 3.2 第二种
//遍历字典中的左右的value
for value in dict2.values {
    print(value)
}
//—-> 3.3 第三种
//遍历字典中所有的key/value
for (key,value) in dict2 {
    print(key)
    print(value)
}
//合并字典-->相同类型的字典也是不能相加合并的
let dict3 = [
    "name":"xiaofeng",
    "age":18,
    "career":"it"
] as [String : Any]
var dict4 = ["height":1.99,"phoneNume":"119"] as [String : Any]
for (key,value) in dict3 {
    dict4.updateValue(value, forKey: key)
}
print(dict4)
//元组
//1 例子:定义一组数据,用于描述个人信息
//使用元组
let infoTuple = ("xiaofeng", 20, 1.90)
infoTuple.0
infoTuple.1
infoTuple.2
//—-> 1.3 给元组起别名
//给元组中每一个元素起别名
let infoTuple1 = (name : "xiaofeng", age : 20 , height : 1.90)
infoTuple1.name
infoTuple1.0
infoTuple1.age
infoTuple1.1
infoTuple1.height
infoTuple1.2
//—-> 1.4 解释别名含义
//别名就是元组对应标识符的名称
//let (name, age, height) = ("xiaofeng", 20, 1.90)
//name
//age
//height

/*可选类型(难点)
1 可选类型推出的目的:对nil值进行处理
2 定义可选类型
*/
//定义可选类型
var name : Optional<String> = nil
//给可选类型赋一个具体的值
print(name)
name = "xiaofeng"
print(name)
//从可选类型中取出具体的类型 强制解包: 可选类型 + !
//强制解包: 可选类型 + !
print(name!)
//可选类型的注意: 如果可选类型中没有值,那么强制解包程序会崩溃
//建议:在对可选类型进行解包之前,先判断可选类型是否等于nil
if name != nil {
    print(name!)
}
//6 可选绑定
//—-> 6.1 判断name是否有值,如果没有值,直接不执行{}
//—-> 6.2 如果name有值,那么系统会对name进行解包,并且将解包的结果赋值
if let tempName = name {
    print(tempName)
}
if let name = name {
    print(name)
}