Swift资源库--官方文档的学习笔记

hello,这里是我学习官方文档时,记录的笔记,持续更新中~


Swift版本:2.2  Xcode版本:7.3

说明下,我这里是Playground文件,因此没有使用print等来显示打印值,

关于Playground,可以参考我的另一篇文章:Swift开发利器:PlayGround


这里内容是引导型的知识,帮助快速认识swift,具体的每个知识点,我随后会不断更新,然后更新成一个系列,和大家一块学习进步!

OK,上代码和注释:


func 初识swift() {//这是函数名,下面内容都是函数体中:
    var num1 = 42
    var str1 = "sds"

    //1、创建一个常量,显示的指定类型为float,指定初始值为4
    let float1:Float = 4
   

    //2、字符串
    //转字符串方法: String(**) 直接转string
    let str2 = str+String(float1)
    //转字符串方法: \(**)      直接放入字符串中
    let fru = "http://blog.csdn.net/jiang314   \(float1+100)    dsfsdd"
    
    //3、字典数组
    //使用[] 创建数组、字典
    var arr1 = ["sd","wew","ss"]
    arr1[0]="sdsd"//使用下标访问
    arr1
    var dic1 = ["as":"1","w":"2"]
    dic1["as"]="http://blog.csdn.net/jiang314"   //使用键访问
    dic1
    dic1[dic1.startIndex].0
    dic1[dic1.startIndex].1
    
    //3.1、创建空的数组,字典
    let arr3 = [String]()
    let arr4 = []
    let dic3 = [String:Float]()
    let dic4 = [:]
    
    
    //4、控制流
    //使用if switch来进行条件操作,使用for-in for while do-while来进行循环。()可以省略,但是{}必须保留
    
    //4.1、if语句,条件必须是布尔表达式
    //有些变量的值是可选的,可能是一个具体的值,可也是nil。通过:"变量?"
    var optstr:String? = nil
    if let name = optstr {
        var gerr = "fee\(name)"
    }else{
        var gerr = "fee"
    }
    
    
    //4.2、switch语句 支持任意类型的数据的比较
    //运行switch中匹配的句子后,会自动的退出switch,不用加break
    var varq = "qw pper"
    switch varq {
    case "qqq":
        let zz2 = "http://blog.csdn.net/jiang314"
    case "sa1","13":
        let zz2 = "sdsd"
    case let x where x.hasSuffix("pper"):
        let zz2 = "sdsdsd"//let 声明可以用来比较某部分的固定值
        
    default:
        let zz2 = "http://blog.csdn.net/jiang314"
    }
    
    
    
    //4.3、for in 遍历
    let interestingNumbers = [
    "Prime": [2, 3, 5, 7, 11, 13],
    "Fibonacci": [1, 1, 2, 3, 5, 8],
    "Square": [1, 4, 9, 16, 25],
    ]
    var largest = 0
    for (kind, numbers) in interestingNumbers {
        for number in numbers {
                if number>largest {
                    largest = number
                }
        }
    }
    largest
    
    
    
    //4.4、while 条件可以条件前边或者后边
    var n=2
    while n<100{
        n=n*2
    }
    n
    
    var m=2
    repeat {
       m = m*2
      } while m<100
    m
    
    
    
    //4.5、for循环
    //可以使用..<表示【)\...表示【】,可以使用原始的<,>表示
    var firstForLoop = 0
    for i in 0...3 {
        firstForLoop += i
    }
   firstForLoop
    
  var secondForLoop = 0
  for var i=0;i<=3;++i{
     secondForLoop += i
   }
   secondForLoop
    
    

    
    //5、函数闭包
    //使用func声明函数,使用名字\参数调用函数,使用->指定返回值
    func greet(name:String,day:String) ->String {
        return"大家好,我博客地址是\(name),我的博客是: \(day)"
    }
    greet("http://blog.csdn.net/jiang314", day: "http://blog.csdn.net/jiang314")
   

    //5.2、元组---------让一个函数有多个返回值
    func getGasPrices(scrores:[Int]) -> (min :Int, max:Int, sum:Int) {
        var min = scrores[0]
        var max = scrores[0]
        var sum = 0
        for scro in scrores {
            if scro>max {
                max = scro
            }else if scro<min{
                min = scro
            }
            sum+=scro
        }
        return (min,max ,sum)
    }
    let aa = getGasPrices([12,232,33,-12,0,1111])
    aa.max
    aa.min
    aa.sum

    //5.3、函数带可变个数的参数,这些参数在函数内表现为数组的形式
    func sumOf(numbers: Int...) -> Int {
        var sum = 0
        for number in numbers {
            sum += number
        }
       return sum
    }
    sumOf()
    sumOf(42, 597, 12)
    
    //5.4、函数可以嵌套
    //通过嵌套来重构复杂的函数
    func returnFifteen() -> Int {
        var y = 10
        func add() {
            y += 5}
        add()
        return y
    }
    returnFifteen()
    // 5.4、函数可以作为另一个函数的返回值
    func make() -> (Int ->Int){
        func addone (number:Int) ->Int{
            return 1+number
        }
        return addone
    }
    var inc = make()
    inc(7)
    // 5.4 函数可以做为参数传入另外一个函数:
    func has(list:[Int],cond:Int ->Bool) ->Bool{
        for item in list {
            if cond(item) {
                return true
            }
        }
        return false
    }
    
    func less(number:Int)->Bool {
        return number<10
    }
    var numb = [20,12,23,333,11]
    has(numb, cond: less)
    // 5.4 函数实际上是一种特殊的闭包,可以使用{}创建一个匿名的闭包,使用in将参数和返回值的类型声明与闭包函数体进行分离
    numb.map({
        (number:Int)->Int in
        let res = 3*number
        return res
    })//Map可以参考我的文章:Map方法


    //可以通过参数位置,而不是名称来引用参数。这个方法在短的闭包里面非常有用。当一个闭包作为最后一个参数传给
    //一个函数的时候,它可以直接跟在括号后面
   let sortt = [-1, 5, 3, 12, 2].sort() { $0 > $1 }
    sortt//实现排序,很简单的方法。

    //不熟悉sort的可以参考我的另外一篇文章:sort方法
    
    
    //6 对象和类
    //6.1 使用class和类名来创建一个类,类中属性的声明和常量,变量声明一样,唯一的不同就是他们的上下文是类。同样,方法和函数声明一样
    class Share {
        var number = 0//类的属性
        func sim() -> String {//类的方法
            return "A SDVSV\(number)sss"
        }
    }
    //6.2 创建实例   在类名后面加上括号。使用点语法访问其属性方法
    var  sha = Share()
    sha.number = 12
    var wwwqqw = sha.sim()
    //6.3 上边少了 构造函数来初始化实例 init方法
    class us {
        var 地址:String = "http://blog.csdn.net/jiang314"//声明赋值
        var 名字:String
        init(名字:String){
            self.名字 = 名字 //构造器赋值
        }
        func sim() -> String {
            return "啊啊啊啊,这是啥:\(地址)啥啥啥"
        }
    }
    // 注意::每个属性都要赋值,无论是通过声明,还是通过构造器:init
    
    // 6.4 创建子类
    //如果需要在删除对象之前 进行一些清理工作。那么就需要使用deinit创建一个析构函数
    //子类的定义方法,在类名后面加上父类的名字,用:分割,创建类的时候,并不需要一个标准的类,所以可以忽略父类
    //子类如果要重写父类的方法,需要用override 标记。如果没有添加override,就重写的话,编译器会报错。同样,编译器也会检测,重写的方法,是否在父类里面。
    class subq:us{
        var side:Double
        init(side:Double,名字:String){
            self.side = side
            super.init(名字:名字)
            地址 = "http://blog.csdn.net/jiang314"
        }
        func area() -> Double {
            return side*side
        }
        override func sim() -> String {
            return "怎么可能呢,参考这里啊:\(地址)。。。66666"
        }
    }
    
    let test = subq(side: 10,名字: "我的博客")
    test.area()
    test.sim()
    
    // 6.5 set get 属性
    class equ :us{
        var sideL:Double = 0.0//设置子类的属性
        init(sideL:Double,名字: String) {//调用init构造方法
            self.sideL = sideL
            super.init(名字: 名字)//父类构造方法
            地址 = "http://blog.csdn.net/jiang314"
        }
        var per:Double{//子类的方法 set  get
            get {
                return 3.0*sideL
            }
            set{
                sideL = newValue/3.0
            }
        }
        override func sim() -> String {//重写父类的方法
            return "sdsdsd\(sideL)"
        }
    }
    var tr = equ(sideL: 100,名字: "我的博客")
    tr.per
    tr.per = 9.99999999
    tr.sideL
    //注意上边的per构造器,执行了三步 1、设置子类声明的属性 2、调用父类的构造器 3、改变父类定义的属性值
    
    //6.6 willset didset方法
    //不需要计算属性的值,但是需要在设置新值之前,或者之后运行代码,使用will/didset
    //参见文档demo
    
    //6.7 类中的方法,和一般的函数有区别的,函数的参数名只在函数内部使用,但是方法的参数名,可以在调用方法的时候,显式的显示,默认情况下,方法的参数名和他在方法的内部是一样的,不过可以定义第二个名字,这个名字,只在方法的内部使用:
    class Counter {
        var count: Int = 0
        func incrementBy(amount: Int, numberOfTimes times: Int) ->Int{//内部俩名 numberOfTimes times
          count += amount * times
            return 12
        }
    }
    var counter = Counter()
    counter.incrementBy(2, numberOfTimes: 7) //外部调用 numberOfTimes
    
    
    // 6.8 ?的使用
    //处理了变量的时候,可以在操作(方法,属性,子脚本)之前加? 如果?之前是nil,那么?之后的会被忽略
    //并且整个表达式返回nil,否则执行?之后的部分。因此,整个表达式是一个可选的部分
    
    
    
    // 7 枚举
    //使用enmu 来创建一个枚举。就像类和其他所有命名类型一样,枚举可以包含方法
    enum Rank:Int {
        case Ace = 1
        case Two, Three, Four, Five, Six, Seven, Eight, Nine, Ten//2-10
        case Jack, Queen, King//11-13
        func simpleDescription() -> String {
            switch self {
            case .Ace:
                return "ace"//1
            case .Jack:
                return "jack"//11
            case .Queen:
                return "queen"//12
            case .King:
                return "king"//13
            case .Three:
                return "three"//3
            default:
                return String(self.rawValue)
            }
        }
    }
    let ace = Rank.Ten
    let acee = ace.rawValue
    let accc = ace.simpleDescription()
    // rawValue: 对应原始值。使用之可以在原始值与实际值之间切换
    //上边的例子里面,枚举的原始值 类型是 int ,只需要设置第一个原始值,剩下的会按照顺序进行赋值。
    //也可以使用浮点数或者字符串作为枚举的原始值
    if let convertedRank = Rank(rawValue: 3)  {
       let threeDescription = convertedRank.simpleDescription()
    }
    if let convertedRank = Rank(rawValue: 13)  {
        let threeDescription = convertedRank.simpleDescription()
    }
    
    //枚举成员值是实际值,实际上原始值没有什么意义的话,不需要设置
    enum Suit {
        case Spades, Hearts, Diamonds, Clubs
        func simpleDescription() -> String {
            switch self {
            case .Spades:
                return "spades"
            case .Hearts:
                return "hearts"
            case .Diamonds:
                return "diamonds"
            case .Clubs:
                return "clubs"
            }}}
    let hearts = Suit.Hearts
    let heartsDescription = hearts.simpleDescription()
    
    

    //8 结构体
    //使用struct来创建结构体,和类有很多的相似处,比如方法和构造器。最大的区别是,结构体在于传值,类是传引用
    struct Card {
        var rank: Rank//里面是枚举
        var suit: Suit//枚举
        func simpleDescription() -> String {
            return "The \(rank.simpleDescription()) of \(suit.simpleDescription())"
        }
    }
    
    let threeOfSpades = Card(rank: .Three, suit: .Spades)
    let threeOfSpadesDescription = threeOfSpades.simpleDescription()
    
    //日出日落。注意如何从ServerResponse 里面获取时间
    enum ServerResponse {
        case Result(String, String)
        case Error(String)
    }
    let success = ServerResponse.Result("6:00 am", "8:09 pm")
    let failure = ServerResponse.Error("Out of cheese.")
    switch success {
        case let .Result(sunrise, sunset):
            let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunset)."
        case let .Error(error):
            let serverResponse = "Failure... \(error)"
        }
    
    
    // 9 协议
    //使用protocol声明协议

   //协议  写在header
protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
}
   
    //类,枚举,结构体 都可以实现协议
    class SimpleClass: ExampleProtocol {
        var simpleDescription: String = "A very simple class."
        var anotherProperty: Int = 69105
        func adjust() {
            simpleDescription += "  Now 100% adjusted."
        }}
    var a = SimpleClass()
    a.adjust()
    let aDescription = a.simpleDescription
    
    struct SimpleStructure: ExampleProtocol {
        var simpleDescription: String = "A simple structure"
        mutating func adjust() {
            simpleDescription += " (adjusted)"
        }
    }
    var b = SimpleStructure()
    b.adjust()
    let bDescription = b.simpleDescription
    //注意声明 SimpleStructure时候,mutating关键字用来标记一个会修改结构体的方法,
    // SimpleClass:不需要声明标记任何方法,因为类中会经常修改任何方法的
    // 当处理类型是协议的值时,协议外的定义的方法,不可用。也就是,不能调用协议外(通过扩展等定义的)的方法,属性
    
    
    //10 扩展
    //使用 extension 来为现有的类型添加新功能,可以使用扩展在别处修改定义,甚至从外部库或者框架引入类型,使得这个类型遵循某个协议。  写在header
 
//扩展
extension Int:ExampleProtocol{
    var simpleDescription:String {
        return  "the num \(self)"
    }
    mutating func adjust(){
        self += 42
    }
}
12.simpleDescription

    
    //11 泛型
    //在尖括号 里面写一个名字来创建一个泛型函数或者泛型
//    func repeat<ItemTypeq>(item: ItemTypeq, times: Int) -> ItemTypeq[] {
//        var result = ItemType[]()
//        for i in 0..times {
//            result += item
//        }
//        return result
//    }
//    repeat("knock", 4)
    //以上是旧的方法,最新的如下:
    //详情参见 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/GenericParametersAndArguments.html
    func simpleMax<T: Comparable>(x: T, _ y: T) -> T {
        if x < y {
            return y
        }
        return x
    }
    simpleMax(17, 42)
    simpleMax(3.14159, 2.71828)
    //创建泛型类,枚举,结构体
    enum Op<T>{
        case None
        case Some(T)
    }
    var poss:Op<Int>  = .None
    poss = .Some(100)
    //在类型名后面,使用where 来指定对类型的需求,比如限定类型实现某一协议,限定两个类型是相同的,或者限定某个类必须要有特定的父类
    func anyCommonElements <T, U where T: SequenceType, U: SequenceType, T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element> (lhs: T, rhs: U) -> Bool {
        for lhsItem  in lhs {
            for rhsItem in rhs {
                if lhsItem == rhsItem {
                    return true
                }}}
    return true}
    anyCommonElements([1,2,3], rhs: [3])
    //简单起见,可以忽略where,只在冒号后面,写协议或者类名
    //<T: Equatable> is the same as writing <T where T: Equatable>.
}//函数体结束

初识swift()

最后:

1、Swift的官方文档:

2、本文的代码:代码

3、swift官方文档:PDF版

4、swift官方文档:  中文版

5、其他知识,还请参考,本人的Swift开发资源库系列文章。

6、欢迎大家加swift开发者群:179235963


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值