1. 程式人生 > >Swift快速入門之getter 和 setter

Swift快速入門之getter 和 setter

屬性可以用getter和setter方法的形式提供。

//擼碼狗
class CodingDog : Dog{
    //擼程式碼年數
    var codingYears:Double
    //擼程式碼總行數
    var codeLines:Int

   init(name:String,age:Int,codingYears:Double){
        self.codingYears=codingYears
        self.codeLines = 100000000000
        super.init(name: name, age: age)
    }

   //getter和setter形式的屬性,每年平編碼數:
var averageCodeLinesOneYear:Double{ get{ return Double(self.codeLines) / self.codingYears } set{ //用平均值乘上年數改變總編碼數 self.codeLines = Int(newValue * self.codingYears) } } //重寫了父類的方法 override func talk(){ print("我是一隻擼碼狗"
) } }

程式碼中averageCodeLinesOneYear就是一個屬性,這種屬性叫計算屬性(一般的屬性叫存值屬性),因為不對應一個變數,值是計算出來的。說白了就是個方法。只能是var,不能let,即使只有get沒有set時也必須是var。set方法中的newValue是個隱式的引數,儲存賦給此屬的值。這種屬性使用時的語法跟一般的屬性沒有區別。

如果你不想提供一個計算屬性,而只是想在存值屬性的值被改變時執行一些操作,那就要實現willSet和didSet兩個方法,如下:

//擼碼狗
class CodingDog : Dog{
    //擼程式碼年數
    var codingYears:Double
    //擼程式碼總行數
var codeLines:Int init(name:String,age:Int,codingYears:Double){ self.codingYears=codingYears self.codeLines = 100000000000 self.hasGirlFried = false super.init(name: name, age: age) } //getter和setter形式的屬性,每年平編碼數: var averageCodeLinesOneYear:Double{ get{ return Double(self.codeLines) / self.codingYears } set{ //用平均值乘上年數改變總編碼數 self.codeLines = Int(newValue * self.codingYears) } } //注意,此屬性不是計算屬性 var hasGirlFried:Bool{ willSet{ print("will set hasGirlFried") } didSet{ print("did set hasGirlFried") } } //重寫了父類的方法 override func talk(){ print("我是一隻擼碼狗,旺旺!") } }

hasGirlFried實現了willSet和didSet,hasGirlFried必須是存值屬性。計算屬性是不能實現willSet和didSet的,原因很簡單,計算屬性本來就是方法,在方法中愛幹啥幹啥,要實現willSet和didSet的功能不很簡單嗎?

當改變hasGirlFried的值時,就會先呼叫willSet的程式碼再呼叫didSet的程式碼。

相關推薦

Swift快速入門getter setter

屬性可以用getter和setter方法的形式提供。 //擼碼狗 class CodingDog : Dog{ //擼程式碼年數 var codingYears:Double //擼程式碼總行數 var codeLines:

Swift快速入門可選型別與錯誤處理

可選型別 可選型別是個什麼東西呢?其實就是把空值與非空值也作為不同的型別來處理。這個空指的是變數值為null,而不是空字串的空,空陣列的空,也不是蒼井空的空。 那麼變數的型別除了傳統的型別之外,還要再說明能不能為空,才構成完整的型別。比如可以為nil的整型變

javaScript ObjectdefineProperty實現gettersetter

var setGetAndSet = function(obj,key){ var initVlaue = obj[key] Object.defineProperty(obj,key,{

Vue計算屬性gettersetter

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <ti

swift標頭檔案與變數gettersetter的學習見解

       6月份,蘋果公司除了swift語言,剛剛學objective-c的我開始把魔爪伸向swift了,為了對蘋果開發有更深入的瞭解,我把之前 用objective-c寫的一個簡單微部落格戶端改成swift的版本,其中發現了幾個問題,在這裡我就其中的標頭檔案討論一下吧

JavaScript中閉包實現的私有屬性的getter()setter()方法

參數 strong prop nbsp body 利用 edi 獲取 展示 註意: 以下的輸出都在瀏覽器的控制臺中 <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g

【OC學習-8】存取器方法?gettersetter?事實上就是賦值返回值的兩種函數

trac -m main 都是 protect pro 聲明 return 安全 我們在聲明類的時候,有實例變量+方法(函數),這些實例變量假設默認的話都是protected類型,一般無法直接訪問。更別提賦值和調用了,所以就產生了兩種函數,ge

【第二篇】ASP.NET MVC快速入門數據註解(MVC5+EF6)

red 數據庫結構 varchar model 菜單 錯誤提示 edi 還需 問題 目錄 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入

【第三篇】ASP.NET MVC快速入門安全策略(MVC5+EF6)

對象 code word 單身 script ticket bsp 金額 class 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入門之

java裏gettersetter的作用(轉載)

details 訪問 str 內部 比較 進行 無需 銀行 自己的 【java】類中使用getter和setter的優勢 http://www.importnew.com/9716.html java有三大特性:封裝,繼承還有多態。

【第四篇】ASP.NET MVC快速入門完整示例(MVC5+EF6)

redirect name php sql語句 rop 方法 輸入框 一次 編輯 目錄 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入門

【番外篇】ASP.NET MVC快速入門免費jQuery控件庫(MVC5+EF6)

south ade 批量刪除 HP 存儲 重新 mode eve 穩定 目錄 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入門之安全策略

【第一篇】ASP.NET MVC快速入門數據庫操作(MVC5+EF6)

c項目 教程 建數據庫 因此 F5 ctr 文件頭部 lec 跨站請求偽造 目錄 【第一篇】ASP.NET MVC快速入門之數據庫操作(MVC5+EF6) 【第二篇】ASP.NET MVC快速入門之數據註解(MVC5+EF6) 【第三篇】ASP.NET MVC快速入門之安全

Objective-C中,類方法的gettersetter可以用點運算符嗎?

clang col 靜態變量 變量 uri family lan getc sta Objective-C中,對象實例property的getter和setter可以使用點運算符來操作,那麽類方法的getter和setter可以使用點運算嗎? 答案是肯定的。 看如下代碼

ES6中class的gettersetter在繼承中踩坑

在 Class 內部可以使用get和set關鍵字, 對某個屬性設定存值函式和取值函式, 攔截該屬性的存取行為。 在 Class 內部的get、set用法,看起來比較舒服,而且可以寫同名函數了。 class MyClass { constructor() {} get prop() {

C++快速入門---靜態屬性靜態方法(15)

C++快速入門---靜態屬性和靜態方法(15)   靜態屬性和靜態方法 把一個或多個成員宣告為屬於某個類,而不是僅屬於該類的物件。 好處1:程式設計師可以在沒有建立任何物件的情況下呼叫有關的方法。 好處2:能夠讓有關的資料仍在該類的所有物件間共享。  

C++快速入門---覆蓋方法過載方法(13)

C++快速入門---覆蓋方法和過載方法(13)   覆蓋方法(overriding) 覆蓋:在基類裡提供一個通用函式,但在它的某個子類裡需要修改這個方法的實現。 子類覆蓋基類的方法。 修改例題,為我們的Animal新增eat()方法,並在Pig和Turtle中覆蓋。

C++快速入門---this指標類的繼承(10)

C++快速入門---this指標和類的繼承(10)   this是一個特殊的指標 class Human {    char fishc;    Human(char fishc); } Human::Human(char

C++快速入門---構造器析構器(9)

C++快速入門---構造器和析構器(9)   使用面向物件的程式設計技術開發程式最基本步驟: - 定義一個有屬性和方法的類(模板) - 為該類建立一個變數(實現)   構造器和通常方法的主要區別: - 構造器的名字必須和它所在的類的名字一樣 - 系

【論文閱讀筆記3】序列模型入門LSTMGRU

本文只是吳恩達視訊課程關於序列模型一節的筆記。 參考資料: 吳恩達深度學習工程師微專業之序列模型 博文——理解LSTM 吳恩達本來就是根據這篇博文的內容來講的,所以 個人認為 認真學習過吳恩達講的那個課程後可以不用再看那篇博文了,能獲得的新的知識不多,另外網上的博文基本也都是根據那篇