之前学习了 swift,但是感觉语法变化太大,经常很多写法,现在 swift 已经相当稳定,但是看了下发现之前写的代码一片红,才发现很多地方变了,所以准备最近再看下,主要是要用起来
方便起见直接贴代码
// 1.导入框架 import UIKit // 2.在swift中如果定义一个标识符.必须告诉编译器该标识符是一个变量还是一个常量 // 如果是常量使用let修饰 // 如果是变量使用var修饰 // let 标识符的名称 : 类型 = 赋值 //可以省略类型,有类型推导 // var 标识符的名称 : 类型 = 赋值 // 使用注意: // 1.一般优先使用let,只有当是需要修改时候才使用var // 2.常量的本质:指向的内存地址不可以被修改,但是可以通过内存地址获得对象后,之后修改对象的内部的属性 // 3.隐式转化:在Int类型和Double进行基本运算时,会自动将Int类型转成Double // let a : Int = 10;//如果一行只有一条语句那么后面的;可以省略 // a = 10;//报错,因为let是常量不可以被修改 // let view : UIView;// = [UIView alloc] init]; // var b :Double = 1.44; // b = 20.44;//b是变量可以被修改 // let a = 10.0; // let result = Int(a); // print(result) // // let view : UIView = UIView(); // view.backgroundColor = UIColor.red; // view.frame = CGRect(x: 10, y: 10, width: 100, height: 100); // self.view.addSubview(view); // // let view1 : UIView = UIView(frame: CGRect(x: 20, y: 20, width: 100, height: 100)); // view1.backgroundColor = UIColor.blue; // self.view.addSubview(view1); // // let btn : UIButton = UIButton(frame: CGRect(x: 0, y: 0, width: 20, height: 20)); // btn.backgroundColor = UIColor.green; //btn方法调用 // btn.addTarget(self, action: #selector(ViewController.youyouyou), for: UIControlEvents.touchUpInside) // btn.addTarget(self, action: #selector(ViewController.youyouyou), for: .touchUpInside)//或者这样 // view1.addSubview(btn); // 3.打印 // print("hahah") // 4.swift和OC的区别 // 1.swift中if后面的()可以省略 // 2.没有非0即真,必须有明确的Bool -> true/false // let a = 10; // if a > 0 { // print("a大于0") // } else { // print("a不大于0") // } // // let score = 66; // if score < 0 || score > 100 { // print("不合理的分数") // } else if score < 60 { // print("不及格") // } else if score < 80 { // print("及格") // } else if score < 90 { // print("良好") // } else { // print("优秀") // } // 5.三目运算符 // let m = 10; // let n = 20; // let result = m > n ? m : n; // print(result);//n 20 // 6.guard的使用 // 1.如果条件表达式为真,则会执行后面的语句 // 2.如果条件表达式为假,则会执行else后面的{}中的语句 //func getScore( a : Double) -> Void { // // guard a > 60 else { // print("不及格") // return // } // guard a > 80 else { // print("不错,及格了") // return // } // guard a > 100 else { // print("优秀") // return // } // print("chao神") //} // 7.swift中的switch和OC的区别 // 1.switch后面的()可以省略 // 2.case结束后可以不加break,系统会默认跟上break // 3.case后面跟多个条件,并且多个条件以,进行分割 // 4.如果case中希望产生case穿透,可以使用fallthrough // 5.switch支持浮点型 // 6.switch支持字符串类型 // 7.switch支持区间类型 //func getSex(sex:Int) -> Void { // switch sex {//sex可以是整型,浮点型,字符串 // case 0: // print("女") // case 1,2,3: // print("男") // case 4...8: // print("幺") // fallthrough//穿透 // default: // print("不知道") // } //} //swift中方法 //func youyouyou() -> Void{ // print("hahah") //} // 8.循环for // 需求:打印0-9 // 1.写法一 //for i in 0..<10{ // print(i) //} // 2.写法二 // 如果for循环中不需要使用到下标i,可以用_代替 //for _ in 0..<10 { // print("aoliu") //} // 9.循环while do while // 注意: // 1.没有非零即真,必须有一个明确的bool值 // 2.while后面的()可以省略 // 3.没有a-- // 4.do while 不是do ,do用到了异常捕获 这里用repeat代替 //var a = 10 // //while a > 0 { // a -= 1 // print(a) //} //var m = 10 //repeat { // m -= 1 // print(m) //}while m > 0 // 10.字符串 // 注意: // 一,OC和Swift中字符串的区别 // 1.在OC中字符串类型时NSString,在Swift中字符串类型是String // 2.OC中字符串@"",Swift中字符串"" // 二.使用 String 的原因 // String 是一个结构体,性能更高 // NSString 是一个 OC 对象,性能略差 // String 支持直接遍历 // Swift 提供了 String 和 NSString 之间的无缝转换 //let str = "hello world" //var string = "hello world" //string = "aoliu" //1.获取字符串长度 //let length = string.characters.count //2.遍历字符串中所有的字符 //for c in string.characters { // print(c) //} //3.字符串的拼接 //let a = "ao" //let b = "liu" //let result = a + b //4.字符串和其他标识符的拼接 //let age = 18 //let name = "aoliu" //let height = 1.78 //let info = "my name is \(name) ,\(age) years old, height is \(height)" //5.字符串的格式化 //let time = 90 //let min = time / 60 //let second = time % 60 //let timeStr = String(format: "%02d:%02d", min,second) //6.字符串截取:将String转变为NSString再截取 //let urlString = "www.baidu.com" //let header = (urlString as NSString).substring(to: 3) //let footer = (urlString as NSString).substring(from: 10) //let range = NSMakeRange(4, 5) //let middle = (urlString as NSString).substring(with: range) // 11.数组 // 数组(Array)是一串有序的由相同类型元素构成的集合 // 数组中的集合元素是有序的,可以重复出现 // Swift中的数组 // swift数组类型是Array,是一个泛型集合 //1.定义数组 //let array : [String] = ["aoliu","xiaowang"]//不可变 [String]泛型 //var array1 = [String]()//可变数组 //2.CRUD //array1.append("xiaomin") //array1.append("xiaohong") //array1.append("xiaoli") //array1.remove(at: 1)//返回值是删除的元素 //array1.remove(at: 0)//返回值是删除的元素 // //array1[0] = "ao" // //let name = array1[0] //3.遍历数组 //for i in 0..<array1.count { // print(i) // print(array1[i]) //} // //for name in array1 {//常见 // print(name) //} // //for (index,name) in array1.enumerated(){//swift提供的既能拿到下标又能拿到元素,常见 // print(index) // print(name) //} //for name in array1[0..<1]{//可以指定遍历区间 // print(name) //} //4.数组合并 //注意:只有相同类型的数组才能合并,不一致不能 //let name1 = ["aoliu","xiaowang"] //let name2 = ["xiaohong","xiaoli"] //let name3 = name1 + name2 // 12.字典 // 字典允许按照某个键来访问元素 // 字典是由两部分集合构成的,一个是键(key)集合,一个是值(value)集合 // 键集合是不能有重复元素的,而值集合是可以重复的,键和值是成对出现的 // Swift中的字典 // Swift字典类型是Dictionary,也是一个泛型集合 // []如果里面放元素就是数组,如果放键值对就是字典 //1.定义字典 //let dict :[String:Any] = ["name":"AOLIU","age":26] //var dictM = [String : Any]() //2.对可变字典的基本操作 //dictM["name"] = "XIAOWANG" //dictM["name"] = nil //dictM.updateValue(19, forKey: "age") //print(dictM) //dictM.removeValue(forKey: "age") //print(dictM) //let name = dictM["name"] //print(name ?? "dd") //如果name没有值为nil就用??后面的代替 //3.遍历字典 //3.1遍历字典中所有的key //dictM["name"] = "XIAOWANG" //dictM["age"] = 26 //for key in dictM { // print(key)//打印出的是一个元祖,随后看 ("name", "XIAOWANG") ("age", 26) // print(key.0)// name age // print(key.1)// XIAOWANG 26 //} //for key in dictM.keys { // print(key)//name age //} //3.2遍历字典中所有的value //for value in dictM.values { // print(value)//XIAOWANG 26 //} //3.1遍历字典中所有的key/value //for (key,value) in dictM {//()元祖 // print(key)//name age // print(value)//XIAOWANG 26 //} //4.合并字典 // 字典不可以相加合并 //let dict1 :[String:Any] = ["name":"AOLIU","age":18] //var dict2 = ["height":1.80,"weight":"65"] as [String : Any]//如果字典中value值类型不一样就需要as如果一样就不用 ////var dict3 = ["height":1.80,"weight":65] // //for (key , value) in dict1 { // dict2.updateValue(value, forKey: key) //} //print(dict2) // 13.元组 // 元组是Swift中特有的,OC中并没有相关类型 // 它是什么呢? // 它是一种数据结构,在数学中应用广泛 // 类似于数组或者字典 // 可以用于定义一组数据 // 组成元组类型的数据可以称为“元素” //let infoTuple = ("name",26,1.78) //infoTuple.0//"name" String //infoTuple.1// 26 Int //infoTuple.2// 1.78 Double //元组一般作为方法的多个返回值 //func test() -> (String,Int,Double) { // return ("name",12,1.22) //} //元组可以给每一个元素起别名 //let infoTuple1 = (name:"AOLIU",age:12,height:1.66) //infoTuple1.name//AOLIU //infoTuple1.age//12 //infoTuple1.height//1.66 //let (name,age,height) = ("name",26,1.78) //name//"name" String //age// 26 Int //height// 1.78 Double // 14.可选类型(重点,难点) // 概念: // 在OC开发中,如果一个变量暂停不使用,可以赋值为0(基本属性类型)或者赋值为空(对象类型) // 在swift开发中,nil也是一个特殊的类型.因为和真实的类型不匹配是不能赋值的(swift是强类型语言) // 但是开发中赋值nil,在所难免.因此推出了可选类型 // 可选类型的取值: // 空值 // 有值 //可选类型推出的目的:对nil值进行处理 //1.定义可选类型 var name : Optional<String> = nil//方法一 var age : Int? = nil//方法二(语法糖) if age != nil { print(age!) print("afdaf") } print(age ?? "hahhaha") print(age as Any) //现在打印可选类型有三种方式处理 //1.强制解包 print(age!) //2.如果为空选择代替 print(age ?? "hahhaha") //3.防止报错直接让age可以为任何类型 print(age as Any) //2.给可选类型赋值 print(name ?? "d") name = "AOLIU" print(name ?? "d")//如果可选类型有值就是name,如果可选类型为nil就用??后面的代替 //3.从可选类型中取出具体的类型 //强制解包 : 可选类型 + ! print(name!) //4.可选类型注意:如果可选类型中没有值强制解包程序会崩溃 //所以:在对可选类型进行强制解包前,先判断可选类型是否等于nil if name != nil { print(name!) } print(name ?? "kong") //5.可选绑定 //可选绑定做了两件事情 //1.判断name是否有值,如果没有(nil)大括号不会执行 //2.如果name有值,系统会将可选类型进行解包然后赋值给tempName if let tempName = name { print(tempName) } //或 if let name = name { print(name) } //可选类型练习: //练习一: let str = "13" let num = Int(str)//num为可选类型,因为str有可能能转为Int也有可能不能转为Int,如果不能转为Int就会为nil,所以是可选类型 print(num ?? "为空")//使用??后面的来提醒用户 if num != nil { print(num!)//通过强制解包获取num的值,但是如果num为nil就会崩溃,所以最好在强制解包之前进行判断 } print(num as Any)//将num转化为Any任何值,但是获取到的是还是一个可选类型 Optijjonal() //练习二: let path = Bundle.main.path(forResource: "123.plist", ofType: nil)//返回的是一个可选类型,因为如果bundle中没有找到123.plist就会返回nil if let path = path { NSArray(contentsOfFile: path)//这里需要传的必须是一个String(路径);但是path是可选类型,所以必须进行强制解包,解包前最好进行判断 } //练习三: let url = URL(string: "www.baidu.com") if let url = url { NSURLRequest(url: url) print(url) } let urlStr = NSURL(string: "www.baidu.com")//同练习二,返回的是可选类型 if let urlStr = urlStr { NSURLRequest(url: urlStr as URL) print(urlStr) } //15.类型转化 //常见的类型转化符号 //is : 用于判断一个实例是否是某一种类型 和OC中的isKindofClass:功能一样 //as : 将实例转成某一种类型 //as?: 转成的最终类型是一个可选类型 //as!: 转成的最终类型是一个具体类型 //is的用法 let array : [Any] = ["AOLIU",26,1.78] let ArrayM = [NSObject]() if let firstObj = array.first { if firstObj is Int { print("是Int") }else{ print("不是Int") } } //as的用法 let dict : [String : Any] = ["name" : "AOLIU", "age" : 26, "height" : 1.78] let dictM = [String : NSObject]() let value = dict["name"]//value是一个可选类型,因为可能取出来有值,可能没有值 //as?: 转成的最终类型是一个可选类型 if let value = value {//可选绑定 //将value转化为字符串 let valueStr = value as? String//valueStr还是一个可选类型,因为as?最终类型是一个可选类型 if let valueStr = valueStr {//可选绑定 print("my name is " + valueStr) } } //NSObject?转化为NSString? if let valueStr = value as? String { print("my name is " + valueStr) } //NSObject?转化为NSString //但是如果转化不成功就会崩溃 print("my name is " + (value as! String))
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于