博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
swift学习第一章
阅读量:4146 次
发布时间:2019-05-25

本文共 17375 字,大约阅读时间需要 57 分钟。

前言:

对iOS开发者的忠告:在这个技术不断更迭的互联网时代,作为一个iOS开发者如果变成语言只掌握OC是远远不够的,如果是这种情况,你也很容易被淘汰。博主希望iOS开发者也学会一门后台语言,无论是PHP,或者是JAVA,或者其他。不然,你在公司永远没有地位。
本章主要介绍swift语言
swift–》苹果于2014年WWDC(苹果开发者大会)发布的新开发语言。作为一个iOS开发者也是必须熟练掌握的一门语言。
如果你对别人说swift和OC语法一样,那面试官只能对你呵呵哒了。他们的写法千差万别。

Objective-C对象是基于运行时的,消息传递机制是在运行时才决定实际调用的具体实现。而Swift为了提高性能,如果没有特殊需要的话,成员以及方法在编译时就已经决定了。基于上述区别,如果我们在Objective-C代码中使用Swift类型的时候,会因为在运行时找不到所需要的信息

描述一下我个人对swift学习的方法

  • 在github 上面找几个swift工程了解一下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/

你可能感兴趣的文章
【Python基础4】for循环、while循环与if分支
查看>>
【Python基础5】列表和元组
查看>>
【Python基础6】格式化字符串
查看>>
【Python基础7】字典
查看>>
【Python基础8】函数参数
查看>>
【Python基础9】浅谈深浅拷贝及变量赋值
查看>>
Jenkins定制一个具有筛选功能的列表视图
查看>>
【Python基础10】探索模块
查看>>
【Python】将txt文件转换为html
查看>>
[Linux]Shell脚本实现按照模块信息拆分文件内容
查看>>
Windows安装git
查看>>
【Python】对象属性操作内置函数(hasattr/getattr...)
查看>>
Python classmethod类方法修饰符
查看>>
Python staticmethod静态方法
查看>>
Linux ftp服务配置
查看>>
html内联样式(表),外部样式表
查看>>
html id和class用法
查看>>
CSS选择器
查看>>
bootstrap栅格系统简介,CSS库的引用
查看>>
git clone->git commit->git push流程介绍
查看>>