本文共 17375 字,大约阅读时间需要 57 分钟。
前言:
对iOS开发者的忠告:在这个技术不断更迭的互联网时代,作为一个iOS开发者如果变成语言只掌握OC是远远不够的,如果是这种情况,你也很容易被淘汰。博主希望iOS开发者也学会一门后台语言,无论是PHP,或者是JAVA,或者其他。不然,你在公司永远没有地位。 本章主要介绍swift语言 swift–》苹果于2014年WWDC(苹果开发者大会)发布的新开发语言。作为一个iOS开发者也是必须熟练掌握的一门语言。 如果你对别人说swift和OC语法一样,那面试官只能对你呵呵哒了。他们的写法千差万别。Objective-C对象是基于运行时的,消息传递机制是在运行时才决定实际调用的具体实现。而Swift为了提高性能,如果没有特殊需要的话,成员以及方法在编译时就已经决定了。基于上述区别,如果我们在Objective-C代码中使用Swift类型的时候,会因为在运行时找不到所需要的信息
描述一下我个人对swift学习的方法//// secondViewController.swift// mySwiftDemo//// Created by 中本 on 2018/10/17.// Copyright © 2018年 中本. All rights reserved.//import UIKitclass secondViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.white; getVarbile(); let sumber = sumOfNumbers(1,2,3,4) print(sumber) let result = extFunc() print(result) optionalFunc2(); let possibleValue = optionalFunc5(value: true)//要用可选绑定判断再使用,因为possibileValue为String? 可选类型 if let value = possibleValue { print(value) }else { print("none value") } let possibleFunc = optionalFunc7(value: true) //要用可选绑定判断再使用,因为possibleFunc 为可选类型的闭包,类型为()->(Void) if let aFunc = possibleFunc { print(aFunc()) }else { print("none func") } let someClass = PossibleClass(someValue: 4) print(someClass) let someStruct = PossibleStruct(someValue: 4, possibleValue: nil) let oneStruct = PossibleStructInit(someValue: "abc") if let one = oneStruct { print(one.someValue) }else { print("none value") } let twoStruct = PossibleStructInit(someValue: "") if let two = twoStruct { print(two.someValue) }else { print("none value") } let oneEnmu = PossibleEnumuInit(director: "E") if let one = oneEnmu { print(one) } else { print("none value") } let towEnmu = PossibleEnumuInit(director: "A") if let two = towEnmu { print(two) } else { print("none value") } if let towSocks = CarItem(name: "sock", quantity: 2) { print("name:\(towSocks.name),quantity:\(towSocks.quantity)") } if let zeroShirts = CarItem(name: "shirt", quantity: 0) { print("name:\(zeroShirts.name),quantity:\(zeroShirts.quantity)") }else { print("Unable to initialize zero shirts") } let xiaoming = Dog(name: "xiaoming") if let address = xiaoming.room?.roomAddr, let area = xiaoming.room?.roomArea { print("\(xiaoming.name)的房子地址在:\(address), 面积:\(area)") }else { print("\(xiaoming.name)没有房子") } xiaoming.room = Room(roomAddr: "1234", roomArea: 45) if let address = xiaoming.room?.roomAddr, let area = xiaoming.room?.roomArea { print("\(xiaoming.name)的房子地址在:\(address), 面积:\(area)") }else { print("\(xiaoming.name)没有房子") } let superC = SuperClass(); if let someClass = superC as? SubClass{ //如果转换成功,则用someClass使用即可 }else { //转换失败 } } class person: NSObject { } /* 可选值 **/ //OC中的nil:表示缺少一个合法的对象,是指向不存在对象的指针,对结构体、枚举类型不起作用(会返回NSNotFound) //Swift中的nil:表示任意类型的值缺失,是一个确定的值,要么是该类型的一个值要么什么都没有(即为nil) //一、申明可选常量或变量 func defineOptional() -> Void { let status:Int? = 1 var defaultAddress:String? = "江苏南京" var student:person? //申明可选Person(自定义的类)的变量,初始值为nil //注意:Int?与Int不同,Int?表示可选的Int类型,可以赋值为nil,而Int不可以赋值为nil } //二、使用“!”强制解析获取可选类型的值(不建议直接使用) func optionalFunc1() -> Void { var defaultAddress:String? = "134" if defaultAddress != nil { print("使用!强制解析") }else { print("地址不存在") } var student:person? // print(student!) Xcode crash,because student 初始值为nil,强制解析不行 } //三、使用可选绑定获取可选类型的值(建议的用法) func optionalFunc2() -> Void { var defaultAddress:String? = "123" if let address = defaultAddress {//如果defaultAddress有值或类型转换成功,则将值赋值给address直接使用 print(address)//使用address代替defaultAddress,且不需要加!强制解析 }else { print("地址不存在") } } //四、隐式解析可选类型(用于申明时肯定有初始值,但后面可能为nil) func optionalFunc3() -> Void { var mobileNumber:Int64! = 1389798980 print(mobileNumber) if let number = mobileNumber { print(number) }else { print("没有电话号码") } } //五、空合运算符(用户判断变量或常量是否为nil) //空合运算符: a ?? b 判断a是否为nil,若a不为nil,对a解封,否则返回b的值 func optionalFunc4() -> Void { var status:Int? status ?? 0 print(status) } //六、函数/方法返回类型为可选类型 //A:返回值为可选类型的值(如Int?、 String?、) func optionalFunc5(value:Bool) -> String? { if value { return "返回类型是可选类型值" }else { return nil } } //B:返回值为可选类型的类(如URL?、自定义Person?等) class SomeClass: NSObject { var someValue:Int init?(someValue:Int) {//可失败构造器 if someValue == 1 { return nil } self.someValue = someValue; } } func optionalFunc6(value:Bool) -> SomeClass? { if value { return SomeClass(someValue: 1)//返回的值为nil }else { return SomeClass(someValue: 2)//返回的SomeClass?实例,不为nil } } //返回值为可选类型的闭包(如(()->(void))?) func optionalFunc7(value:Bool) -> (() -> (Void))? { if value { return { () in print("返回类型是可选类型闭包--") } }else { return nil } } //七、可选类型在类或结构体中的运用 //A:可选类型在类中的运用 class PossibleClass: NSObject { var someValue:Int var possibleValue:String? //可选存储属性,默认值为nil init(someValue:Int){ //构造方法中可以不对possibleValue属性初始化 self.someValue = someValue; } } //注意:类中所有属性都需要有默认值。属性可以在申明时赋予初始值,也可以在构造方法中赋予初始值;子类继承父类时,必须先给自身属性先初始化后再继承父类构造方法初始化。一般的,处于安全因素,子类的属性都赋予初始值或直接定义为可选类型 //B:可选类型再结构体中的运用 struct PossibleStruct { var someValue:Int var possibleValue:String?//可选存储属性,默认值为nil //结构体中可以自定义一个init构造器对属性初始化,也可以不自定义 } //八:可选类型再构造器中的运用 //概念:可失败构造器 是一个类、结构体或枚举类型的对象,在构造过程中有可能失败;这里所指的“失败”是指,如给构造器传入无效的参数值,或缺少某种所需的外部资源,又或是不满足某种必要的条件等。 //A:结构体的可失败构造器 struct PossibleStructInit { let someValue:String init?(someValue:String) {//可失败构造器 if someValue.isEmpty { return nil } self.someValue = someValue; } } //枚举的可失败构造器 enum PossibleEnumuInit { case Eset,West,South,North //不带原始值,带原始值的也可以使用失败构造器 init?(director:Character){ switch director { case "E": self = .Eset case "W": self = .West case "S": self = .South case "N": self = .North default: return nil } } } //类的可失败构造器 class Product: NSObject { let name:String init?(name:String) { if name.isEmpty { return nil } self.name = name } } class CarItem: Product { let quantity:Int init?(name:String,quantity:Int) { if quantity < 1 { return nil } self.quantity = quantity super.init(name: name) } } //九、可选类型再可选链中的运用 //概念:可选链为一种可以在当前值可能为nil的可选值上请求和调用属性、方法及下标的方法。如果可选值有值, 那么调用就会成功。如果可选值有值,那么调用就会成功;如果可选值是nil,那么调用将返回nil。多个调用可以连接在一起形成一个调用链,如果其中任何一个节点为nil,真个调用链都会失败,即返回nil。 class Dog: NSObject { var name:String var room:Room? init(name:String) { self.name = name } } class Room: NSObject { var roomAddr:String var roomArea:Int init(roomAddr:String,roomArea:Int) { self.roomAddr = roomAddr self.roomArea = roomArea } } //十、 可选类型再错误处理中的运用 //十一、可选类型再类型转换中的运用 //类型转换再向上转型时一般不会出现失败,例如从子类向父类转型,直接用as即可 //类型转换在向下转型时可能会出现失败,例如:从父类向子类转型,要使用as?转型,使用时需要可选绑定后再用 class SuperClass: NSObject { //这是一个父类 } class SubClass: NSObject { //这是一个子类 } /* 函数方面 **/ //可变参函数定义 func sumOfNumbers(_ start:Int...) -> Int { var sum = 0 for i in start { sum = sum + i } return sum } //嵌套定义 func extFunc() -> Int { var local:Int = 666 func intFunc() -> Int{ local=888 return local } return intFunc() } /* 基本数据类型 **/ func getVarbile() -> Void { //var 表示变量 var i:Int = 10 i = i + 10 print(i) //let 表示常亮 let j = 20 print(j) //float和double类型 let k:Float = 1.2345678 let m:Double = 1.234567890345 print(k) print(m) //字符类型 两个字符会报错 let ch:Character = "d" print(ch) let myString:String = "123" print(myString) var string1:String = "234" string1 = "567flkdsjflk" print(string1) string1.append("我是追加的") //字符串连接 string1 = string1 + "http://" print(string1) let count = string1.count; print(count) //删除首字符 let ch2:Character = string1.remove(at: string1.startIndex) print(ch2) print(string1) //删除尾字符 string1.remove(at: string1.endIndex) //空字符串 if string1.isEmpty { print( "stringB 是空的" ) }else { print( "stringB 不是空的" ) } //字符串中插入值 var varA = 20 let constA = 100 var varC:Float = 20.0 var stringA = "\(varA)成语\(constA)等于\(varC)" print(stringA) //字符串比较 let varD = "Hello, Swift!" let varE = "Hello, World!" let varF = "Hello, World!" if varD == varE { print( "\(varD) 与 \(varE) 是相等的" ) } else { print( "\(varD) 与 \(varE) 是不相等的" ) } if varF == varE { print( "\(varF) 与 \(varE) 是相等的" ) } else { print( "\(varF) 与 \(varE) 是不相等的" ) } //替换 let string4 = "AASFRFGGGHHHRJJJJIRPLKJ" let string5 = string4.replacingOccurrences(of: "GGG", with: "TTT") print(string4) print(string5) let array1:Array = string5.components(separatedBy: "R") print(array1) //删除指定字符 var timeString:String = "2016.12.12" let range1 = timeString.index(timeString.startIndex, offsetBy: 4) timeString.remove(at: range1) print(timeString) let range2 = timeString.index(timeString.startIndex, offsetBy: 2); let ch6:Character = timeString.remove(at: range2) print(ch6) print(timeString) //插入字符 let range3 = timeString.index(timeString.startIndex, offsetBy: 0); timeString.insert("z", at: range3) print(timeString) //删除指定范围字符串 var deleteString:String = "abcdefghijklmn" let range4 = range3...range2 deleteString.removeSubrange(range4) print(deleteString) let age = 10 switch age { case 0...10: print("小朋友") fallthrough case 11...20: print("大朋友") case let x: print("\(x)岁的朋友") } //数组 var arr1:[Int] = [1,2,3,4,5,6] for i in 0.., by: <#T##(Any, Sequence.Element) throws -> Bool#>) var b1 = arr1.elementsEqual([1,2,3,4]) print(b1) //插入 arr1.insert(10, at: 2) print(arr1) //插入多个 arr1.insert(contentsOf: [15,17,19], at: 0) print(arr1) //追加 arr2.append(234) print(arr2) arr2.append(contentsOf: [45,67]) print(arr2) var arr5 = ["12","34","45","67","89","13","35","68"] //删除 let range5:Range = 1..<3 print(arr5) arr5.remove(at: 2) print(arr5) arr5.removeSubrange(range5) print(arr5) //替换 var arr6 = ["12","34","45","67","89","13","35","68"] arr6.replaceSubrange(range5, with: ["1","2","3","4"]) print(arr6) } }
//// thirdViewController.swift// mySwiftDemo//// Created by 中本 on 2018/10/23.// Copyright © 2018年 中本. All rights reserved.//import UIKitclass thirdViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.white let cat = Cat() let animal = cat as Anmimal print(animal) //(2)消除二义性,数值类型转换 let num1 = 42 as CGFloat let num2 = 42 as Int let num3 = 42.5 as? Int let num4 = (42 / 2) as Double print(num1) print(num2) if let num5:Int = num3 { print("111\(num5)") } print(num4) let myAnimal:Anmimal = Cat() let myCat = myAnimal as!Cat print(myCat) //元组 //如:(404,"Not Found")是一个描述HTTP状态码的元祖 var t1:(Int,Double,String) = (88,1.5,"abc"); print("t1=\(t1)") //访问元组中的成员 print(t1.0) print(t1.1) print(t1.2) //定义一个数组 ,数组的元素为元组类型 var arr:[(age:Int,name:String,isMale:Bool)] = []; arr.append((age: 23, name: "A", isMale: true)) arr.append((age: 24, name: "B", isMale: false)) print("arr is \(arr)") print(arr[0]) //swift中 _ 的妙用 //1.格式化数字字面量,提高数字字面量的可读性 let paddedDouble = 123.000_001 let oneMillion = 1_000_000 //忽略元组的元素值 //当我们使用元组时,如果有的元素不需要使用,这时可以使用下划线将相应的元素进行忽略 var http404Error:(Int,String) = (404,"Not Found") print(http404Error) //3.忽略区间值 let base = 3 let power = 10 var answer = 1 for _ in 1...power { answer *= base } //忽略外部参数名 } //1.as使用场合 //(1)从派生类转换为基类,向上转型(upcasts) class Anmimal: NSObject { } class Cat: Anmimal { } //(2)消除二义性,数值类型转换 //(3)switch语句中进行模式匹配 //如果不知道一个对象是什么类型,你可以通过switch语法检测它的类型,并且尝试在不同情况下使用对应的类型进行相应的处理 //2. as!使用场合 //向下转型(Downcasting)时使用。由于是强制类型转换,如果转换失败会报runtime运行错误 //3、as?使用场合 //as?和as!操作符的转换规则完全一样。但as?如果转换不成功的时候会返回一个nil对象。成功的话返回可选类型值(optional),需要我们拆包使用 //由于as?在转换失败的时候也不会出现错误,所以对于如果能确保100%会成功的转换则可使用as!,否则使用as? }
//// fourViewController.swift// mySwiftDemo//// Created by 中本 on 2018/10/23.// Copyright © 2018年 中本. All rights reserved.//import UIKitclass fourViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() //swift 字典类型 var dict: Dictionary= Dictionary(); dict["美女"] = 18; dict["帅哥"] = 19; print("dict\(dict)") //有类型推导 var dict2 = Dictionary () dict2["010"] = "北京" dict2["110"] = "上海" print("dict2\(dict2)") let dict3 = ["浙江":"A","上海":"B"] //dict3 被推导为Dictionary let c = dict3.count print("c=\(c)") //遍历 for obj in dict3 { print("obj=\(obj)") print("obj.0=\(obj.0),obj.1=\(obj.1)") } for (A,B) in dict3 { print("A=\(A),B=\(B)") } var arr:Array = [4,5,6,7,8,9] for obj in arr { print("数组: obj=\(obj)") } for (index,value) in arr.enumerated() { print("index=\(index),value=\(value)") } /* 闭包: 概念:闭包是一个能够在代码中定义和使用的自包含的功能块,即一个代码块 三种形式: 1,全局函数(有名字但不能捕获值) 2.嵌套函数 3.闭包表达式 **/ let A:UInt = xabs1(n: -5) let B:UInt = xabs2(-6) let C:UInt = xabs2(-7) //执行闭包 let sum = clo1(3,5) print("sum=\(sum)") //inout var someInt = 7 var anotherInt = 107 swapTwoInts(a: &someInt, b: &anotherInt) print("someInt is\(someInt),anotherInt is\(anotherInt)") /* 结构体: 元组:将多个s数据组合在一起 结构体: 是将多个数据和方法组合在一起形成一个对象,对数据和方法的封装 **/ } //第一种闭包 函数 func xabs1(n:Int) -> UInt { return UInt(n>0 ? n:-n) } func xabs2(_ n:Int) -> UInt { return UInt(n>0 ? n:-n) } //第二种闭包嵌套函数 func xsqrt(_ n:Int) -> Int { let m = n func double1(_ t:Int) ->Int { return t*2 } return double1(m) } //闭包表达式 var clo1 = {(a:Int,b:Int) ->Int in return a+b } func swapTwoInts(inout a:Int, inout b:Int) -> Void { let temp = a a = b b = temp } }
转载地址:http://zzcti.baihongyu.com/