Swift開發第六篇——操作運算符也可以重載& func 的參數修飾

来源:http://www.cnblogs.com/Jepson1218/archive/2016/03/17/5285794.html
-Advertisement-
Play Games

本篇分為兩部分: 與別的語言不同,Swift 支持運算符的重載,運算符指的是“+,-,%,*”等操作運算符,從而使一些操作更加簡便。 在開發中,我們對於一些基本運算通常是這樣寫的: v3 的輸出結果為:3,7 但是,當這種二位數組過多時,如果我們依然用這種方式,我們的代碼將變得異常臃腫,程式員也會變


本篇分為兩部分:

1、Swift 中重載操作運算符的使用

2、Swfit 中 func 的參數修飾

 


1、Swift 中重載操作運算符的使用

與別的語言不同,Swift 支持運算符的重載,運算符指的是“+,-,%,*”等操作運算符,從而使一些操作更加簡便。

在開發中,我們對於一些基本運算通常是這樣寫的:

struct Vector2D {
    var x = 0.0
    var y = 0.0
}

let v1 = Vector2D(x: 2, y: 3)
let v2 = Vector2D(x: 1, y: 4)
let v3 = Vector2D(x: v1.x+v2.x, y: v1.y+v2.y)

v3 的輸出結果為:3,7

但是,當這種二位數組過多時,如果我們依然用這種方式,我們的代碼將變得異常臃腫,程式員也會變得沒有耐心,所以 Swift 為了提高工作效率,創造出了重載運算符這種文藝的編程方式,上面的代碼可以優化為:

// Swift 支持重載操作符這樣的特性,從而使一些計算更加簡便
func +(left: Vector2D, right:Vector2D) -> Vector2D {
    return Vector2D(x: left.x + right.x, y: left.y + right.y)
}

let v = v1 + v2 + v3  // 再往後繼續加都可以

v 的輸出結果為:6,14

因為 +, -, * 這樣的操作符是因為 Swift 中已經有定義了,所以不會保錯,如果我們要加入新的操作符的話,需要先對其進行聲明

infix operator +* {  // infix:表示要定義的是一個中位操作符,即前後都是輸入;其他的修飾還包括 prefix 和 postfix
    associativity none  // associativity:定義結合律,規定計算順序,加法減法為 left,點乘用 none
    precedence 160    // precedence:運算的優先順序,Swift 中乘除的優先順序是150,加減是140

}
func +*(left: Vector2D, right:Vector2D) -> Double {
    return left.x * right.x + left.y * right.y
}
let result1 = v1 +* v2

result1 的輸出結果為:14.0

註意:Swift 的操作符是不能定義在局部域中的,因為至少會希望能在全局範圍內使用你的操作符,否則操作符就失去意義了

 


2、Swfit 中 func 的參數修飾

在 Swift 中所有的變數都被預設為不可變的,也就是用 let 進行聲明,在方法上也是如此,所以此代碼會報錯:func test(i: Int) -> Int

解決辦法:

func incrementor(var i: Int) -> Int {
    return ++i
}
print("計算後的結果為:\(incrementor(7))")

輸出結果:計算後的結果為:8

// 柯里化及多元組綜合使用, inout 修飾符曾在多元組中使用
func makeIncrementor(addNumber: Int) -> ((inout Int) -> ()) {
    func incrementor(inout variable: Int) -> () {
        variable += addNumber;
        print(variable);
    }
    return incrementor;
}
var i = 2;
let addMethod = makeIncrementor(3)
addMethod(&i)
addMethod(&i)
addMethod(&i)
addMethod(&i)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 轉發自:http://blog.csdn.net/ligang7560/article/details/50890282 單例模式的多種實現方式 我們都知道單例模式有幾種常用的寫法: 餓漢模式 懶漢模式 雙重校驗鎖 靜態內部類 靜態代碼塊 我們來看一下這幾種模式在多線程的場景中,能否保持單例 1.餓
  • 繼續更新有關重構的博客,前三篇是關於類、函數和數據的重構的博客,內容還算比較充實吧。今天繼續更新,本篇博客的主題是關於條件表達式的重構規則。有時候在實現比較複雜的業務邏輯時,各種條件各種嵌套。如果處理不好的話,代碼看上去會非常的糟糕,而且業務邏輯看上去會非常混亂。今天就通過一些重構規則來對條件表達式
  • 原題重述:(點擊圖片可以進入來源鏈接) 這到題目的中文解釋是, 輸入一個數組,例如{-1 0 1 2 -1 -4},從數組中找三個數(a,b,c),使得其和0,輸出所有的(a,b,c)組合。 要求abc不能重覆,並且a<=b<=c。 拿到這個題目的時候,其實每個程式猿都能想到如下的演算法,也就是暴力破
  • 正則表達式並不是Python的一部分。正則表達式是用於處理字元串的強大工具,擁有自己獨特的語法以及一個獨立的處理引擎,效率上可能不如str自帶的方法,但功能十分強大。得益於這一點,在提供了正則表達式的語言里,正則表達式的語法都是一樣的,區別隻在於不同的編程語言實現支持的語法數量不同;但不用擔心,不被
  • 運行一下上面這段代碼,看會有什麼提示信息? Warning: preg_match(): Compilation failed: PCRE does not support L, l, N, P, p, U, u, or X at offset 3 in F:http://www.hzhuti.co
  • 演算法:用原來字母後面的第四個字母替代原來的字母。明文:China 密文:Glmre
  • Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below
  • 上一篇從整體上介紹了 介面,從上一篇我們知道了 框架的最頂層實現是 類, 工廠類中提供的 、`newFixedThreadPool newCachedThreadPool ThreadPoolExecutor ThreadPoolExecutor`線程池的運行過程。 1.線程池狀態 既然要講運行過程
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...