Swift學習】Swift編程之旅---方法(十五)

来源:http://www.cnblogs.com/salam/archive/2016/04/30/5444969.html
-Advertisement-
Play Games

在Swift中結構體和枚舉也能夠定義方法,而在 Objective-C 中,類是唯一能定義方法的類型。 實例方法 實例方法是屬於某個特定類、結構體或者枚舉類型實例的方法,實例方法提供訪問和修改實例屬性的途徑,實例方法的語法與函數完全一致。實例方法能夠隱式訪問它所屬類型的所有的其他實例方法和屬性。實例 ...


  在Swift中結構體和枚舉也能夠定義方法,而在 Objective-C 中,類是唯一能定義方法的類型。

 

  實例方法

   實例方法是屬於某個特定類、結構體或者枚舉類型實例的方法,實例方法提供訪問和修改實例屬性的途徑,實例方法的語法與函數完全一致。實例方法能夠隱式訪問它所屬類型的所有的其他實例方法和屬性。實例方法只能被它所屬的類的某個特定實例調用。實例方法不能脫離於現存的實例而被調用。

class Counter { 
  var count = 0 
  func increment() { 
    count++ 
  } 
  func incrementBy(amount: Int) { 
    count += amount 
  } 
  func reset() { 
    count = 0 
  } 
} 

和調用屬性一樣,用點語法(dot syntax)調用實例方法

 

  方法的局部參數名稱和外部參數名稱

  Swift 預設僅給方法的第一個參數名稱一個局部參數名稱;預設同時給第二個和後續的參數名稱局部參數名稱和外部參數名稱。這個約定與典型的命名和調用約定相適應,與你在寫 Objective-C 的方法時很相似。這個約定還讓表達式方法在調用時不需要再限定參數名稱。

下麵Counter的另外寫法

class Counter { 
  var count: Int = 0 
  func incrementBy(amount: Int, numberOfTimes: Int) { 
    count += amount * numberOfTimes 
  } 
} 

incrementBy方法有兩個參數: amount和numberOfTimes。預設情況下,Swift 只把amount當作一個局部名稱,但是把numberOfTimes即看作局部名稱又看作外部名稱。下麵調用這個方法:

let counter = Counter() 
counter.incrementBy(5, numberOfTimes: 3) 
// counter value is now 15 
你不必為第一個參數值再定義一個外部變數名:因為從函數名incrementBy已經能很清楚地看出它的作用。但是第二個參數,就要被一個外部參數名稱所限定,以便在方法被調用時明確它的作用。   這種預設的行為能夠有效的處理方法(method),類似於在參數numberOfTimes前寫一個井號(#):
func incrementBy(amount: Int, #numberOfTimes: Int) { 
 count += amount * numberOfTimes 
} 

 這種預設行為使上面代碼意味著:在 Swift 中定義方法使用了與 Objective-C 同樣的語法風格,並且方法將以自然表達式的方式被調用。

 

  修改方法的外部參數名稱行為

  你可以自己添加一個顯式的外部名稱或者用一個井號(#)作為第一個參數的首碼來把這個局部名稱當作外部名稱使用。   相反,如果你不想為方法的第二個及後續的參數提供一個外部名稱,可以通過使用下劃線(_)作為該參數的顯式外部名稱,這樣做將覆蓋預設行為。

 

  self屬性

   類型的每一個實例都有一個稱為“self”的隱式屬性,它與實例本身相當。你可以在一個實例的實例方法中使用這個隱含的self屬性來引用當前實例。

  上面例子中的increment方法還可以這樣寫

func increment() { 
  self.count++ 
} 

   你不必在你的代碼裡面經常使用self。Swift 假定你是指當前實例的屬性或者方法。這種假定在上面的Counter中已經示範了:Counter中的三個實例方法中都使用的是count(而不是self.count)

在實例方法的某個參數名稱與實例的某個屬性名稱相同的時候,優先參數名,所以在引用屬性時必須使用一種更嚴格的方式。這時你可以使用self屬性來區分參數名稱和屬性名稱。下麵的例子中,self消除方法參數x和實例屬性x之間的歧義:
struct Point { 
  var x = 0.0, y = 0.0 
  func isToTheRightOfX(x: Double) -> Bool { 
    return self.x > x 
  } 
} 
let somePoint = Point(x: 4.0, y: 5.0) 
if somePoint.isToTheRightOfX(1.0) { 
  println("This point is to the right of the line where x == 1.0") 
} 
// 輸出 "This point is to the right of the line where x == 1.0"(這個點在x等於1.0這條線的右邊)

 

 如果不使用self首碼,Swift 就認為兩次使用的x都指的是名稱為x的函數參數

 

  在實例方法中修改值類型

結構體和枚舉是值類型。一般情況下,值類型的屬性不能在它的實例方法中被修改。但是,如果你確實需要在某個具體的方法中修改結構體或者枚舉的屬性,你可以選擇mutating關鍵字修飾實例方法,然後方法就可以從方法內部改變它的屬性;並且它做的任何改變在方法結束時還會保留在原始結構中。方法還可以給它隱含的self屬性賦值一個全新的實例,這個新實例在方法結束後將替換原來的實例。將關鍵字mutating 放到方法的func關鍵字之前  
struct Point { 
  var x = 0.0, y = 0.0 
  mutating func moveByX(deltaX: Double, y deltaY: Double) { 
    x += deltaX 
    y += deltaY 
  } 
} 
var somePoint = Point(x: 1.0, y: 1.0) 
somePoint.moveByX(2.0, y: 3.0) 
println("The point is now at (\(somePoint.x), \(somePoint.y))") 
// 輸出 "The point is now at (3.0, 4.0)"

 註意:不能在結構體類型常量上調用變異方法,因為常量的屬性不能被改變,即使想改變的是常量的變數屬性也不行,

    在變異方法中給self賦值(Assigning to self Within a Mutating Method)     mutating方法能夠賦給隱含屬性self一個全新的實例。上面Point的例子可以用下麵的方式改寫
struct Point { 
  var x = 0.0, y = 0.0 
  mutating func moveByX(deltaX: Double, y deltaY: Double) { 
    self = Point(x: x + deltaX, y: y + deltaY) 
  } 
} 

 枚舉的變異方法可以把self設置為相同的枚舉類型中不同的成員

enum TriStateSwitch { 
  case Off, Low, High 
  mutating func next() { 
    switch self { 
    case Off: 
      self = Low 
    case Low: 
      self = High 
    case High: 
      self = Off 
    } 
  } 
} 
var ovenLight = TriStateSwitch.Low 
ovenLight.next() 
// ovenLight 現在等於 .High 
ovenLight.next() 
// ovenLight 現在等於 .Off 

 上面的例子中定義了一個三態開關的枚舉。每次調用next方法時,開關在不同的電源狀態(Off,Low,High)之前迴圈切換。

    類型方法   聲明類的類型方法,在方法的func關鍵字之前加上關鍵字class;聲明結構體和枚舉的類型方法,在方法的func關鍵字之前加上關鍵字static。 註意:在 Objective-C 裡面,你只能為 Objective-C 的類定義類型方法(type-level methods)。在 Swift 中,你可以為所有的類、結構體和枚舉定義類型方法:每一個類型方法都被它所支持的類型顯式包含     類型方法和實例方法一樣用點語法調用
class SomeClass { 
  class func someTypeMethod() { 
    // type method implementation goes here 
  } 
} 
SomeClass.someTypeMethod() 

 

  在類型方法的方法體(body)中,self指向這個類型本身,而不是類型的某個實例。對於結構體和枚舉來說,這意味著你可以用self來消除靜態屬性和靜態方法參數之間的歧義     一般來說,任何未限定的方法和屬性名稱,將會來自於本類中另外的類型級別的方法和屬性。一個類型方法可以調用本類中另一個類型方法的名稱,而無需在方法名稱前面加上類型名稱的首碼。同樣,結構體和枚舉的類型方法也能夠直接通過靜態屬性的名稱訪問靜態屬性,而不需要類型名稱首碼。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • github:https://github.com/zhoushengmufc/iosselect webapp模仿ios下拉菜單 html下拉菜單select在安卓和IOS下表現不一樣,iosselect正是為統一下拉菜單樣式而生 我們以IOS下select的交互和樣式為藍本,開發了這一組件 先看 ...
  • 在網頁中,進度條的效果並不少見,如:平分系統、載入狀態等,進度條組件使用了css3的transition和animation屬性來完成一些特效,這些特效在IE9及IE9以下版本、Firefox的老版本中並不支持,Opera 12 不支持 animation 屬性。 進度條和其他獨立組件一樣,開發者可... ...
  • 一、聲明方式 1. 直接賦值 2. 構造函數 這兩種有什麼區別呢? 第一種方式只是聲明瞭一個變數,使用typeof str得到的是'string'。而第二種方式則創建了一個String的包裝對象,typof str2得到的是’object'。 通過console.log輸出 str2中的[[Prim ...
  • Knockout 新版應用開發教程之創建view models與監控屬性 章節導航 章節導航 最近抽出點時間研究MVVM,包括司徒正美的avalon,google的angular,以及Knockout,博客園Tom的Knockout指南 時隔2年了,ko更新了不少,所以文檔也相應的變化了,所以本人從 ...
  • Mustache通常被稱為JavaScript模板的基礎。另一個流行的解決方案Hanldebars實際上就是基於Mustache構建而成的。這並不意味著Mustache是一個不好的模板解決方案。 下麵例舉一例: 一旦在頁面中包含了Mustache,你就可以訪問全局對象“Mustache”。你可使用其 ...
  • var notedt=$("#dateid").val(); if(notedt=="" || notedt=="undefined") { alert("111"); return false; } notedt = notedt.replace(/-/g,"/"); var datenow=ne ...
  • 作為一個.NET碼農,在前端高速發展的時代,深深感覺自己那麼點“前端”技術不夠看,比如開發出來的js css等文件龐大,不便於管理,還記得以前的開發就是累加 html css jquery, 現在去面試,人家關註的是什麼,HTML5? CSS3? nodeJs? angularJs? grunt? ...
  • 方法一: 方法二: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...