Swift

作者: RedSun_ | 来源:发表于2016-01-04 14:05 被阅读337次

    外部参数名总结:

    假设有以下代码

    func sum(num1: Int, num2: Int) -> Int
    {
        return num1 + num2
    }
    
    • 函数

      • 默认情况下,所有参数仅仅是局部参数名,不是外部参数名
      sum(1, 2)
      
    • 方法

      • 默认情况下,第一个参数仅仅是除第一个参数以外,其他所有参数,既是局部参数名,又是外部参数名
      var me = Person()
      me.sum(1, num2: 2)
      
    • 构造方法

      • 默认情况下,所有参数既是局部参数名,又是外部参数名
      var me = Person(num1: 1, num2: 2)
      

    !和?的区别

    从IB中拖线的控件对应的变量:

    // 系统自带
    @IBOutlet weak var display: UILabel!
    
    // 如果这样
    @IBOutlet weak var display: UILabel?
    

    ?表示display是一个可选类型(option),!表示对可选类型进行强制解包,如果解包的变量是nil,程序就会崩溃.

    系统自带的相当于在xib解档赋值的时候,进行了强制解包;而后面修改后,赋值时没有进行强制解包,所以后面使用display时,需要这样使用以获取其属性-->display!.text

    枚举

    swift的枚举可以关联任何类型,包括函数

    函数在swift里面也是一个类型,和字符串没什么区别

    在swift,所有的运算符,*等都是函数

    尽量使内部成员private,在以后想访问时再进行打开操作

    数组和字典在swift中是结构体(Int、Double等也是),所以传值的时候,是进行的值传递;除类是引用传递以外,其他类型都是值传递

    Optional就是一个enum

    enum Optional<T> {
        case None
        case Some(T)
    }
    
    
    let x: String? = nil 等价
    let x = Optional<String>.None
    
    let x: String? = "hello" 等价
    let x = Optional<String>.Some("hello")
    
    var y = x! 等价
    switch x {
        case Some(let value): y = value
        case None: 抛出异常
    }
    
    

    ...和..<是Range结构体的特殊实现:

    struct Range<T> {
        var startIndex: T
        var endIndex: T
    }
    

    关于桥接

    Swift中,String、Array、Dictionary是结构体(struct),不是对象(classes),但是他们还是可以称为AnyObject类型。这是因为他们桥接的NS对应类型是对象(NSString、NSArray、NSDictionary)

    构造器的自动继承

    1、 子类没有定义任何指定构造器,它将自动继承所有父类的指定构造器
    2、如果子类提供了所有父类指定构造器的实现--不管是通过规则1继承过来的,还是通过自定义实现的,它将自动继承所有父类的便利构造器

    模型相关

    模型使用struct进行定义

    如果想在控制器中扩展模型的属性,直接在控制器中使用extension扩展模型属性就行了,因为只增加了自己想要使用的属性,模型中原来的属性并没有变化,所以并没有不合适的地方

    判断当前控制器view有没有显示在界面上

    if view.window == nil {
      // 没有显示在当前界面上
    }
    

    关于unwind(在storyboard中点击对应控件进行返回)

    有控制器V1->V2->V3

    需要点击V2上的按钮跳转会V1、点击V3的按钮跳转会V1

    可以在Storyboard中做以下操作:

    1、在V1中实现以下方法

    • 这个方法有两点要求
      • 需要有@IBAction修饰
      • 参数需要为UIStoryboardSegue类型
    @IBAction func goBack(segue: UIStoryboardSegue) {
        print("哈哈哈哈")
    }
    

    2、在V2、V3选中对应按钮,control+draging到对应控制器的以下地方

    Snip20160104_1.png
    3、如果在V1中实现了1步骤中方法,就会出现以下图片

    Snip20160104_2.png
    4、选择对应的方法,当点击V2、V3对应按钮时,就会进行跳转,并且执行这个方法

    闭包中使用属性

    swift闭包中使用属性,必须要加self,因为swift要提醒程序员,闭包中可能会造成循环引用

    ![

    Snip20160104_6.png ]

    swift代码风格

    swift类中定义静态变量

    Snip20160104_4.png

    属性监视器中设置属性额外操作

    Snip20160104_5.png
    如上,在属性监视器中,可以设置以下操作:
    • 1、当将要设置视图的这个约束时,就将原先的这个约束清除
    • 2、当设置完这个约束之后,就将这个约束设置到view上

    这两步充分利用了属性监视器,要是原先OC的写法,这两步操作就和属性分离了,得在设置属性的地方进行上面两个操作,或者得在setter方法中设置。

    上面的属性是在这个属性的set方法中设置的

    Snip20160104_6.png

    在属性监视器中设置属性的一些值

    dataSource的设置可以放在属性监听器里面,delegate也是同理

    Snip20160104_9.png

    给view添加手势也可以在属性监视器中

    关于IBOutlet没有初始化的预防

    Snip20160104_10.png
    • 这里的scrollView采用可选链来访问属性,是因为在设置image图片时,IBOutlet可能还没有设置
    • 这里的image计算属性,相当于imageView存储属性的set和get方法,方便对其进行操作
      • 主要是设置完imageView可以使用set,来对scrollView进行设置
    • 对scrollView一些属性的操作,可以放在scrollView已经被设置方法即didSet里面

    多线程注意

    Snip20160104_11.png
    • 多线程写法
    • 上面判断url是因为可能这次请求数据没到,下次就来了,所以需要判断

    初始化注意

    Snip20160104_12.png

    相关文章

      网友评论

        本文标题:Swift

        本文链接:https://www.haomeiwen.com/subject/udcahttx.html