美文网首页iOS学习程序员iOS开发
Swift(七 方法 构造 析构)

Swift(七 方法 构造 析构)

作者: DSA碼侬 | 来源:发表于2017-08-30 18:45 被阅读41次

一、方法:

1、类是由 属性 与 方法 组成。在枚举、结构体、类内部定义的。分为 实例方法静态方法
  • 调用方式:
    实例方法--实例名.方法名
    静态方法--类型名称.方法名
    // 注:函数的调用不需要调用者
2、可变方法

结构体枚举 的方法默认下是不能修改值类型变量属性的。如下所示:

struct Rectangle{

      var width: Double = 0.0
      var height: Double = 0.0

    // 实例方法
    func changeWidth(width:Double) -> () {   // func之前加上mutating是ok的
          self.width = 320    // 如果结构体属性width与方法参数不同,则self可以省略不写,在这里是相同的self必须加上
     }
}
// 编译失败:MyPlayground.playground:111:5: note: mark method 'mutating' to make 'self' mutable
func changeWidth(width:Double) -> () {
^
mutating 

如果在方法名前加上mutating关键字,方法就是可变的,可变方法能够修改值类型变量属性,但不能修改值类型常量属性。

  • 类的方法就是可变的,不需要添加关键字mutating便可修改值类型变量属性
  • 在struct enum中,如果不修改方法是可变的。可以把要修改的类类型属性修改成引用类型数据。比如NSMutableArray() \ (self.str as NSString)
3、静态方法
  • 也叫类型方法。枚举、结构体用static,类可用static与class,class该方法可以被子类重写,static不能被子类重写。

  • 静态方法能修改静态变量属性 如下所示:

    struct Rectangle{
    
         static var width: Double = 0.0
         var height: Double = 0.0
    
    
         // 静态方法
         static func changeWidth(width: Double) -> () {
                   Rectangle.width = 123.0  // 静态方法内部不能调用实例属性
                   print(Rectangle.width)
          }
    }  
    
    Rectangle.changeWidth(width: 123.0)// 类型名.方法名
    
    ----------------------------类-----------------------------
    class Rectangle{
    
         static var width: Double = 0.0
         var height: Double = 0.0
    
    
        // 如果是static不是class 则不能在继承类中被重写
       class func changeWidth(width: Double) -> () {
                  Rectangle.width = 123.0  // 静态方法内部不能调用实例属性
                 print(Rectangle.width)
             }
        }
    
       class RectangleB: Rectangle{
             override class func changeWidth(width: Double) -> () {
                        Rectangle.width = 123.0  // 静态方法内部不能调用实例属性 可换static
                        print(Rectangle.width)
             }
    
     }
    

二、构造函数

1、构造函数没有返回值。类的默认的构造函数是init(){},结构体的构造函数是init(){} 与init(顺序属性列表){}

结构体定义:

 struct Rectangle{

    var width: Double = 0.0
    var height: Double = 0.0
}

结构体实例化:(第二种写法是一种默认的构造函数,仅适用于结构体,不适用于类)


结构体默认构造方法
  • 类中默认不含上图中第二个构造函数。可以自己重构构造函数,构造中的函数可以直接作为标签使用(构造函数的重载)

    class Rectangle{
    
          var width: Double
          var height: Double
    
          // 构造函数的重载
          init(width: Double, height: Double) {
                self.width = width
                self.height = height
           }
          init(W width: Double, H height: Double) { // 与上个构造函数为不同的构造函数
                  self.width = width
                  self.height = height
           }
           init(length: Double){
                self.width = length
                self.height = length
           }
           init(){
               self.width = 640.0
               self.height = 960.0
    
           }
    
       }
    
2、属性初始化
    • 在init()构造函数中,属性的赋值

       class Rectangle{
      
            let width: Double   // 注意:构造函数还可以初始化常量存储属性
            var height: Double
      
            init(){
                 width  = 12.0
                 height = 13.0  // 如果构造函数中 没有给属性赋值,编译失败。如果没有构造函数,且也没有给属性赋默认值,也是编译失败的。实例化更是失败了
            }
      }
      
  • 结构体

    struct Rectangle{
    
         var width: Double  // let也是一样的(存储属性)
         var height: Double
    
         init(){
              width  = 12.0
              height = 13.0 // 省略构造函数内容的初始化工作,编译失败。如果没有构造函数,且也没有给属性赋默认值,在没有实例化的情况下,是编译通过的。实例时候失败
         }
    }
    
  • 计算属性不保存数据,所以不需要初始化。构造函数也不能初始化静态属性,因为静态属性与实例无关,构造函数与实例息息相关。

3、构造函数代理
  • 结构体构造函数代理:在同一个类型中通过self.init语句调用当前类型的其他构造函数,其他构造函数就称为构造函数代理

    struct Rectangle{
    
         var width: Double
         var height: Double
    
        // 构造函数的重载
        init(width: Double, height: Double) {
             self.width = width
             self.height = height
        }
       init(W width: Double, H height: Double) {
           self.width = width
           self.height = height
       }
    
       init(length: Double){
             self.init(W: length, H: length) // init(W:H:)就称构造函数代理
        }
        init(){
             self.init(width: 640.0, height: 960.0) // init()就称构造函数代理
    
        }
    
    }
    
  • 类的构造函数代理

    • 横向代理:类似结构体的构造函数代理。便利构造函数(convenience initializer)
      convenience便利,使用convenience修饰的构造函数叫做便利构造函数。便利构造函数通常用在对系统的类进行构造函数的扩充使用。
      便利构造函数的特点:
      1、便利构造函数通常都是写在extension里面
      2、便利构造函数init前需要加上convenience
      3、在便利构造函数中需要调用self.init
    class Rectangle{

         var width: Double
         var height: Double

    // 构造函数的重载
    init(width: Double, height: Double) {
    self.width = width
    self.height = height
        }
    init(W width: Double, H height: Double) {
    self.width = width
    self.height = height
         }

    convenience init(length: Double){  // 便利构造函数
    self.init(W: length, H: length) 
        }
    convenience init(){  // 便利构造函数
       self.init(width: 640.0, height: 960.0) 

       }

    }
  • 向上代理:在继承时候,子类构造函数要先调用父类的构造函数初始化父类的存储属性。指定构造函数(designated initializer)

三、析构函数 deinit

  • 实例内存资源不需要析构函数释放(Swift是ARC),但是清理工作有时候还是需要的。

     // 析构函数
    class RectangleB{
    
         var width: Double
         var height: Double
    
    
         // 构造函数的重载
        init(width: Double, height: Double) {
              self.width = width
              self.height = height
          }
        init(W width: Double, H height: Double) {
             self.width = width
            self.height = height
          }
       convenience init(length: Double){ // convenience代表是便利构造函数
           self.init(W: length, H: length)
       }
       convenience init(){
           self.init(width: 640.0, height: 960.0)
      
        }
    
      deinit {  // rectB1 = nil 赋值为空的时候调用deinit  只有可选类型才能赋值为nil
      print("调用析构函数")
      self.width = 0.0
      self.height = 0.0
     }
    
    
    }
    // 实例化
     var rectB1: RectangleB? = RectangleB(width: 320, height: 480)
     print(rectB1!.width)
     rectB1 = nil

相关文章

  • Swift(七 方法 构造 析构)

    一、方法: 1、类是由 属性 与 方法 组成。在枚举、结构体、类内部定义的。分为 实例方法 与 静态方法 调用方式...

  • iOS开发之Swift篇(12)—— 构造和析构

    目录 版本 构造过程 析构过程 版本 Xcode 11.3.1Swift 5.1.3 构造过程 构造过程是使用类、...

  • Swift4 构造方法与析构方法

    用于完成时例构造的方法被称为构造方法,析构方法是构造方法的逆过程,一个实例对象要被注销或者释放的过程由析f构方法来...

  • Java析构方法

    析构方法与构造方法相反,当对象脱离其作用域时(例如对象所在的方法已调用完毕),系统自动执行析构方法。析构方法往往用...

  • python 13面向对象

    构造函数 析构函数 私有 类方法 静态方法 属性方法

  • PHP面向对象基础知识整理

    面向对象由类、成员(字段)、方法组成,方法大致分为三种,分别是普通方法、构造方法、析构方法,具体区别如下: 析构方...

  • C++面向对象(下) Week5——Boolan

    1.Composition下的构造和析构 构造由内而外 析构由外而内 2.Inheritance 下的构造和析构 ...

  • Swift析构器

    和构造器对应,Swift类都有一个名为deinit的析构器,用来释放对象,释放资源 划重点 析构器是自动调用,不能...

  • Swift5.1构造过程&析构过程

    14.构造过程 构造过程 15.构析过程 析构过程原理析构过程:析构器只适⽤于类类型,当一个类的实例被释放之前,析...

  • 面向对象编程

    构造方法和析构方法 构造方法 类的构造方法 Woman类后面的“()”;其实指的就是构造方法。 只要你想要创建类或...

网友评论

    本文标题:Swift(七 方法 构造 析构)

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