Swift--方法

2019-11-18  本文已影响0人  优雅的步伐

实例方法

实例方法与实例属性类似,都隶属于枚举、结构体或类的个体(即实例),我们通过实例化这些类型创建实例,使用实例调用的方法。

class Account {
  var amount: Double = 10_000.00    //账户金额
  var owner: String = "Tony"        //账户名

  //计算利息
  func interestWithRate(rate: Double) -> Double {
      return rate * amount
  }
}

var myAccount = Account()

//调用实例方法
print(myAccount.interestWithRate(rate: 0.088))
结构体和枚举方法变异

结构体枚举中的方法默认情况下是不能修改值类型变量属性的。

class Employee {
   var no: Int = 0
   var name: String = ""
   var job: String?
   var salary: Double = 0
   var dept: Department?
}

struct Department {
  var no: Int = 0
  var name: String = ""

  var employees: [Employee] = [Employee]()

  mutating func insertWithObject(anObject: AnyObject, index: Int)->() {
      let emp = anObject as! Employee
      employees.insert(emp, at: index)
  }
}

var dept = Department()
var emp1 = Employee()
dept.insertWithObject(anObject: emp1, index: 0)

var emp2 = Employee()
dept.insertWithObject(anObject: emp2, index: 0)

注:在结构体 Department中的insertWithObject方法中不能修改值类型employees属性。加入关键字mutating,使用insertWithObject方法成为一个变异的方法,insertWithObject方法就可以修改结构体的属性employees。

如下图,类 Department中的insertWithObject方法可以修改它的属性employees。
class Department {
  var no: Int = 0
  var name: String = ""

  var employees: [Employee] = [Employee]()

 func insertWithObject(anObject: AnyObject, index: Int)->() {
      let emp = anObject as! Employee
      employees.insert(emp, at: index)
  }
}

注意:结构体和枚举属于值类型,而类属于引用数据类型,引用数据类型实际上指向的是一个对象的内存地址,这个对象的内存地址不可以修改,但对象的内容是可以被修改的,但值类型是不允许修改它里面的内容的。

静态方法

结构体中的静态方法
//结构体中的静态方法
struct Account2 {
    var owner: String = "Tony"
    static var interestRate: Double = 0.0668

    static func interestBy(amount: Double) -> Double {
         return interestRate * amount
    }

    func messageWith(amount: Double) -> String {
        let interest = Account2.interestBy(amount: amount)
        return "\(self.owner)的利息是\(interest)"
    }
}

//调用静态方法
print(Account2.interestBy(amount: 10_000.00))
var myAccount2 = Account2()

//调用实例方法
print(myAccount2.messageWith(amount: 10_000.00))
枚举中的静态方法
//枚举中的静态方法
enum Account3 {
    case 中国银行
    case 中国工商银行
    case 中国建设银行
    case 中国农业银行

    static var interestRate: Double = 0.0668
    static func interestBy(amount: Double) -> Double {
        return interestRate * amount
    }
}

//调用静态方法
print(Account3.interestBy(amount: 10_000.00))
类的静态方法

类静态方法使用的关键字是class或static,如果使用static定义,则该方法不能在子类中被重写(override);如果使用class定义,则该方法可以被子类重写

class Account4 {
    var owner: String = "Tony"

    //可以换成static
    class func interestBy(amount: Double) -> Double {
        return 0.0668 * amount
    }
}

class A: Account4 {
    override static func interestBy(amount: Double) -> Double   {
        return 0.0668 * amount
    }
}
class B: A {
    //因为类B的父类A 中的interestBy方法使用static定义,所以类B中不能重写interestBy方法
}

//调用静态方法
print(Account4.interestBy(amount: 10_000.00))

注意:

上一篇 下一篇

猜你喜欢

热点阅读