• swift3.0新浪微博项目源码--黑码哥,这是黑马程序员最新的swift项目讲解的代码。有学习的可以看看。
  • Swift 3.0 - 初级用法(二) 2017-07-17 16:31:18
    一、对象和类Swift 当中使用class和类名来创建一个类。类中属性的声明和常量、变量声明一样,唯一的区别就是它们的上下文是类。同样,方法和函数声明也一样。class TestViewController: ViewController { var ...
    一、对象和类
    ------
    
    Swift 当中使用class和类名来创建一个类。类中属性的声明和常量、变量声明一样,唯一的区别就是它们的上下文是类。同样,方法和函数声明也一样。
    
    ```
    class TestViewController: ViewController {
        var numberOfSides = 0
        func simpleDescription() -> String {
            return "A shape with \(numberOfSides) sides"
        }
        
        
    }
    
    ```
    
    要创建一个类的实例,在类名后面加上括号。使用点语法来访问实例的属性和方法。
    
    
    ```
            var vc = ViewController()
            
            vc.numberOfSides = 8
            
            var s = vc.returnFifteen()
    ```
    
    这个版本的ViewContrller类缺少了一些重要的东西:一个构造函数来初始化类实例。使用init来创建一个构造器。
    
    ```
    class NamedShape {
        var numberOfSides: Int = 0
          var name: String
        init(name: String) {
            self.name = name
    }
        func simpleDescription() -> String {
            return "A shape with \(numberOfSides) sides."
    } }
    ```
    
    注意 self 被用来区别实例变量。当你创建实例的时候,像传入函数参数一样给类传入构造器的参数。每个属性都 需要赋值——无论是通过声明(就像 numberOfSides )还是通过构造器(就像 name )。
    
    子类如果要重写父类的方法的话,需要用override标记—如果没有添加override就重写父类方法的话编译器会报错。编译器同样会检测override标记的方法时候确定在父类中。
    
    ```
    class Square: NamedShape {
        var sideLength: Double
        init(sideLength: Double, name: String) {
            self.sideLength = sideLength
            super.init(name: name)
            numberOfSides = 4
    }
        func area() ->  Double {
            return sideLength * sideLength
    }
        override func simpleDescription() -> String {
            return "A square with sides of length \(sideLength)."
    } }
    let test = Square(sideLength: 5.2, name: "my test square")
    test.area()
    test.simpleDescription()
    ```
    
    
    除了储存简单的属性之外,属性可以有getter和setter。
    
    
    ```
    class EquilateralTriangle: NamedShape {
        var sideLength: Double = 0.0
        init(sideLength: Double, name: String) {
            self.sideLength = sideLength
            super.init(name: name)
            numberOfSides = 3
    }
    var perimeter: Double {
            get {
                return 3.0 * sideLength
            }
            set {
                sideLength = newValue / 3.0
    } }
        override func simpleDescription() -> String {
            return "An equilateral triagle with sides of length \(sideLength)."
    } }
    var triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
    print(triangle.perimeter)
    triangle.perimeter = 9.9
    print(triangle.sideLength)
    ```
    
    在perimeter的setter中,新值的名字是newValue。你可以在set之后显示的设置一个名字。
    注意 EquilateralTriangle 类的构造器执行了三步:
    1. 设置子类声明的属性值
    2. 调用父类的构造器
    3. 改变父类定义的属性值。其他的工作比如调用方法、getters 和 setters 也可以在这个阶段完成。
    
    二、枚举和结构体
    --------
    
    使用enum来创建一个枚举。就像类和其他所有命名类型一样,枚举可以包含方法。
    
    ```
    enum Rank:Int {
        case Ace = 1
        case Two,Three,Four,Five,Six,Seven
        case Jack,Queen,King
        func simpleDescription() -> String {
            switch self {
            case .Ace:
                return "ace"
            case .Two:
                return "two"
            case .Queen:
                return "queen"
            default:
                return String(self.rawValue)
            }
        }
    }
    
    let ace = Rank.Ace
    let aceRawValue = ace.rawValue
    ```
    
    
    默认情况下,Swift按照从0开始每次加1的方式为原始值进行赋值,不过你可以通过显式赋值进行改变。在上面的栗子中,Ace被显式赋值为1,并且剩下的原始值会按照顺序赋值。你也可以使用字符串或者浮点数作为枚举的原始值。使用rawValue属性来访问一个枚举成员的原始值。
    
    使用`init?(rawValue:)`  初始化构造器在原始值和枚举值之间进行转换。
    
    ```
    if let convertedRank = Rank(rawValue: 3) {
                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 heartDesciption = hearts.simpleDescription()
    ```
    
    注意,有两种方式可以引用`Hearts` 成员:给`hearts` 常量赋值时,枚举成员`Suit.Hearts` 需要用全名来引用,因为常量没有显示指定类型。在`switch` 里,枚举成员使用缩写`.Hearts` 来引用,因为self的值已经知道一个suit。已知变量类型的情况下你可以使用缩写。
    
    一个枚举成员的实例可以有实例值。相同枚举成员的实例可以有不同的值,创建实例的时候传入值即可。实例值和原始值是不同的:枚举成员的原始值对于所有实例都是相同的,而且你是在定义枚举的时候设置原始值。
    
    
    举个栗子,考虑从服务器获取日出和日落的时间。服务器会返回正常结果或者错误信息。
    
    
    ```
    enum SeverResponse {
        case Result(String,String)
        case Failure(String)
    }
    
    let success = SeverResponse.Result("6:00 am","8:00 pm")
    let failure = SeverResponse.Failure("Out of cheese")
    
    switch success {
            case let .Result(sunrise,sunset):
                let serverResponse = "Sunrise is at \(sunrise) and sunset is at \(sunrise)"
                
            case let .Failure(message):
                print("Failure... \(message)")
            }
    ```
    
    注意,日升和日落是如何从SeverResponse中提取到并且与switch的case相匹配的。
    
    使用`struct` 来创建一个结构体和类有很多相同的地方,比如方法和构造器。它们之间最大的一个区别就是结构体时传值,类是传引用。
    
    
    三、协议和扩展
    -------
    
    使用`protocol` 来声明一个协议。
    
    ```
    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 的声明不需要 标记任何方法,因为类中的方法通常可以修改类属性(类的性质)。
    
    使用 extension 来为现有的类型添加功能,比如新的方法和计算属性。你可以使用扩展在别处修改定义,甚至是 从外部库或者框架引入的一个类型,使得这个类型遵循某个协议。
    
    ```
    extension Int: ExampleProtocol {
        var simpleDescription: String {
            return "The number \(self)"
        }
        mutating func adjust() {
    self += 42 
       }
    }
    print(7.simpleDescription)
    ```
    
    你可以使用其他命名类型一样使用协议名—例如,创建一个有不同类型但是都实现一个协议的对象集合。当你处理类型是协议的值时,协议外定义的方法不可用。
    
    ```
    let protocolValue: ExampleProtocol = a print(protocolValue.simpleDescription)
    // print(protocolValue.anotherProperty) // 去掉注释可以看到错误
    ```
    
    即使 protocolValue 变量运行时的类型是 simpleClass ,编译器会把它的类型当做 ExampleProtocol 。这表示你不 能调用类在它实现的协议之外实现的方法或者属性。
    展开全文
  • Swift 3.0介绍 2017-02-22 21:41:39
    概述我接触swift是从2.0开始,当时出于对ios的好奇,加上官方的大力推荐,于是扎入了ios的怀抱,从1.2发展到了今天的3.0.1,这期间由于...尽管对于开发人员来说Swift3.0的变化会令你的程序几乎处处报错,但是试想一下如
  • Swift2.3 --> Swift3.0 的变化 2016-10-15 09:45:08
    Swift3.0语法变化写在前面首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Syntax… 让Xcode帮我们把Swift2.3的代码转换为Swift3.0。 手动调出Xcode...
  • Swift3.0要注意的地方 2017-01-04 10:29:44
    都知道苹果要在下个版本的Xcode中移除Swift2.3的支持,强制开发者使用Swift3.0,这是一个很悲痛的现实��。然而正好公司的项目是OC和Swift混编的项目,里面用到了一个第三方库SwiftBond,当时SwiftBond还没有升级...
  • swift3.0转4.0遇到的坑 2018-05-15 10:38:27
    我们以斗鱼APP为例,总结swift3.0以及swift4.0转换过程中遇到的问题。 一、方法重写问题 1、swift 3.0在子类中的方法重写 我们RecommendVC类继承自BaseAnchorVC,BaseAnchorVC中包含setupUI方法,我们重写...
  • 本文介绍几点Swift 3.0相对于Swift 2.0的一些改变和使用方法 关于Swift 3.0的具体使用指南大家可以去阅读Swift 3.0中文文档(Swift 3.0 中文文档)和Swift 3.0官网文档(Swift 3.0 官网文档)
  • Swift 3.0 环境下使用 AFNetworking 封装网络请求业务类
  • Swift_3.0 相对于 Swift_2.2 版本发生了哪些的变化。本文件将以最直观的代码对比以及文字分析阐述。
  • Swift3.0创建简单的TableView 2016-10-16 16:02:04
    随着Swift3.0的到来,一些语法悄然改变,导致很多以前的博客都不能看了= = 于是,我在这里记录一下自己的Swift3.0编写TableView的简单过程。 (1)在创建一个简单swift项目之后,先点击Main.storyboard文件,把...
  • 每当看到新的编程语言我总是会有相当大的兴趣,是的,Swift 3是一门『新语言』,因为它看起来,怎么都不像过往的 Swift。打开一个老的项目时,发现满目疮痍,基本上能标红的代码全被标红了。先来个截图提提神: 图...
  • swift3.0 字典的基本用法 2016-10-27 11:51:57
    自学swift3.0,如果有什么错误或建议的话欢迎吐槽哦~ //1.字典的定义使用[key:value,key:value]快速定义 let dic:[String:Any] = ["name":"张三","age":22] print(dic) //数组字典 let arrDic:[[String
  • Swift3.0 类型转换 示例 2017-03-14 19:27:46
    // // ViewController.swift // test_Swift3.0_type_casting // // Created by jeffasd on 17/3/14. // Copyright © 2017年 jeffasd. All rights reserved. // import UIKit class ViewController: UIViewContr
  • 在这里列举出一些在网上收集到的关于Swift 3.0的变化,技术更新太快,越来越fashion!!! Swift编译器和标准库的改变 1、编译器和语法变化 函数或方法参数 调用函数或方法时从第一个参数开始就必须...
  • swift 3.0 再探索 - 1.String 2016-08-09 11:43:12
    Xcode8正式版准备上线,swift3.0也标示着这门语言日渐成熟了。 在中国国内,主流的开发语言还是Objective-C,这个主流主要还是国内用户群的问题,国内很多app都是支持的最低版本是iOS 6.0 到最新的。我在坐地铁和...
  • swift3.0自定义运算符 2017-06-18 13:59:44
    swift3.0自定义运算符
  • Swift 3.0 变更小结 2016-12-30 09:34:02
    Apple 官网 Swift 3.0 版本变更文档新增访问符关键字: open, fileprivateApple 官网解释 open: 公开访问接口, 类和成员变量是可以被模块内外 override public: 公开访问接口, 但是只能在模块内被 override ...
  • Swift3.0异常 Error
  • Swift 3.0 以后, GCD 的使用发生了很大的变化, 相比 Swift 2.0+ ,变得更加简洁了!首先学习几个比较重要的概念:队列 1 - 并发队列可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务) 并发功能只有在...
  • Swift 3.0 实现图片轮播器 2016-11-14 16:38:25
    Swift 3.0 实现图片轮播器 图片轮播器的实现方法一般分为两种:一种是用三张图片,通过改变显示的数据源来达到轮播的效果;另一种是通过在数据源的起始和结束位置分别插入数据源的最后一个元素和第一个元素,通过多...
1 2 3 4 5 ... 20
收藏数 9,402
精华内容 3,760