Swift 07.關鍵字

来源:http://www.cnblogs.com/Atropos/archive/2016/01/06/5106403.html
-Advertisement-
Play Games

每一種語言都有相應的關鍵詞,每個關鍵詞都有他獨特的作用,來看看swfit中的關鍵詞:關鍵詞:用來聲明的:class, deinit, enum, extension, func, import, init, let, protocol, static, struct, subscript, type...


每一種語言都有相應的關鍵詞,每個關鍵詞都有他獨特的作用,來看看swfit中的關鍵詞:

 

 關鍵詞:

用來聲明的:

class, deinit, enum, extension, func, import, init, let, protocol, static, struct, subscript, typealias, var

用於子句的:

 break, case, continue, default, do, else, fallthrough, if, in, for, return, switch, where, while

表達式和類型的:

as, dynamicType, is, new, super, self, __COLUMN__, __FILE__, __FUNCTION__, __LINE__

特殊語境使用的:

didSet, get, inout, mutating, override, set, unowned, unowned(safe), unowned(unsafe), weak , willSet

class

用來定義一個類,相信大家並不陌生。

如果定義一個汽車類

class Car  
{  
      init()  
      {  
            //to do init something.  
       }  
}  

init

相對於類的構造方法的修飾。

 deinit

相對於類的釋構方法的修飾。

對於類的構造和釋構在swift 中需要使用關鍵詞來修飾,而很多高級語言並不需要特別的指定,便C++ 只需要類名與構造函數名相同就可以,不需要額外的關鍵詞。

 enum

 枚舉類型的聲明,這個與很多語方都相通。

 

extension

擴展,有點像oc中的categories 。

Swift 中的可以擴展以下幾個:
添加計算型屬性和計算靜態屬性
定義實例方法和類型方法
提供新的構造器
定義下標
定義和使用新的嵌套類型
使一個已有類型符合某個介面

如下麵擴展字元串:

 
extension String{  
    struct _Dummy {  
        var idxVal: Int  
        var _padding: Int  
        var _padding2: Int  
        var _padding3: Int  
    }  
    //過慮出數字  
    func fitlerCharater() -> String  
    {  
        var numberstr : String = ""  
        for character in self  
        {  
            let s :String = String(character)  
              
            //println(s.toInt())  
            if let hs = s.toInt()  
            {  
                numberstr += character  
            }  
        }  
        return numberstr  
    }  
      
    //擴展使用下標訪問  
    subscript (i: Int) -> Character {  
        var dummy: _Dummy = reinterpretCast(i >= 0 ? self.startIndex : self.endIndex)  
            dummy.idxVal += i  
            let idx: String.Index = reinterpretCast(dummy)  
            return self[idx]  
    }  
      
    //擴展使用Range訪問  
    subscript (subRange: Range<Int>) -> String {  
        var start: _Dummy = reinterpretCast(self.startIndex)  
            var end = start  
            start.idxVal = subRange._startIndex  
            end.idxVal = subRange._endIndex  
            let startIndex: String.Index = reinterpretCast(start)  
            let endIndex: String.Index = reinterpretCast(end)  
            return self[startIndex..endIndex]  
    }  
}  

測試:

func testExtension()  
{  
    var str : String = "1234ab5國6cd7中8i90"  
    println(str.fitlerCharater())  
      
    let china: String = "china operating system public to 世界"  
    println("使用下標索引訪問第13個字元 \(china[13])")  
    println("使用負號下標即變為從右往左訪問字元 \(china[-1])")  
    println("使用負號下標即變為從右往左訪問字元 \(china[-2])")  
    println("使用下標Range來訪問範圍 \(china[2...6])")  
    dump(china[1..5], name: "china[1:4]")              //使用dump輸出  
    dump(china[10...13], name: "china[10:13]")  
}  

輸出:

1234567890  
使用下標索引訪問第13個字元 n  
使用負號下標即變為從右往左訪問字元 界  
使用負號下標即變為從右往左訪問字元 世  
使用下標Range來訪問範圍 ina o  
- china[1:4]: hina  
- china[10:13]: atin 

func

 用來修飾函數的關鍵詞。

import

 導入頭文件,相信大家都不陌生,但在swift 中好像被用來導入包,如import UIKit。 因為swift中沒有了頭文件的概念。

let

用來修改某一常量的關鍵詞。像const 限定差不多

var

用來聲明變數。

 protocol

協議,也有稱為介面,這個往往在很多高級語言中不能多重繼承的情況下使用協議是一個比較好的多態方式。

 static

用來修飾變數或函數為靜態

 struct

用來修飾結構體。

 subscript

下標修飾,可以使類(class),結構體(struct),枚舉(enum) 使用下標訪問。

class Garage  
{  
    var products : String[] = Array()  
      
    subscript(index:Int) -> String  
    {  
        get  
        {  
            return products[index]  
        }  
          
        set  
        {  
            if index < products.count  //&& !products.isEmpty  
            {  
                products[index] = newValue  
            }  
            else  
            {  
                products.append(newValue)  
            }  
              
        }  
    }  
}  

測試:

func testSubscript()  
{  
    var garage = Garage()  
    garage[0] = "A"  
    garage[1] = "B"  
    garage[2] = "C"  
    garage[3] = "D"  
    garage[2] = "CC"  
      
    println("index 1 = \(garage[0]) ,index 2 = \(garage[1]),index 3 = \(garage[2]) ,index 4 = \(garage[3])")  
}  

輸出

index 1 = A ,index 2 = B,index 3 = CC ,index 4 = D  

typealias

類型別名,就像typedef一樣。借typedef  unsigned long int    UInt64 

同樣在swift中也可能自定義類型。

 break

跳出迴圈,通常用於for,while,do-while,switch 

 

case

case相信大家並不陌生,常在switch中使用,但如今在swift中多了一個地方使用哪就是枚舉類型。

 

continue

跳過本次迴圈,繼續往後執行。

 

default

預設聲明。常見在switch中。

 

do, else,if, for, return, switch, while

這幾個就不用多說了,越說越混。

in

範圍或集合操作

let str = "123456"  
for c in str  
{  
     println(c)  
}  

 

fallthrough

由於swift中的switch語句中可以省去了break的寫法,但在其它語言中省去break里,會繼續往後一個case跑,直到碰到break或default才完成。在這裡fallthrough就如同其它語言中忘記寫break一樣的功效。

let integerToDescribe = 1  
var description = "The number \(integerToDescribe) is"  
switch integerToDescribe {  
case 1, 3, 5, 7, 11, 13, 17, 19:  
    description += " a prime number, and also";  
    fallthrough  
case 5:  
    description += " an integer"  
default :  
    description += " finished"  
}  
  
println(description)  

 

輸出:

The number 1 is a prime number, and also an integer  

 

where

swift中引入了where 來進行條件判斷。

 

let yetAnotherPoint = (1, -1)  
switch yetAnotherPoint {  
case let (x, y) where x == y:  
println("(\(x), \(y)) is on the line x == y")  
case let (x, y) where x == -y:  
println("(\(x), \(y)) is on the line x == -y")  
case let (x, y):  
println("(\(x), \(y)) is just some arbitrary point")  
}  

當switch的條件滿足where 後面的條件時,才執行語句。

is

as

is 常用於對某變數類型的判斷,就像OC中 isKindClass ,as 就有點像強制類型轉換的意思了。

 for view : AnyObject in self.view.subviews  
{  
    if view is UIButton  
    {  
        let btn = view as UIButton;  
        println(btn)  
    }  
}  

OC的寫法:

 

for (UIView *view  in self.view.subviews)  
{  
      if ([view isKindOfClass:[UIButton class]])         //is 操作  
     {  
             UIButton *btn =(UIButton *)view             //as 操作  
      }  
}  

 

super

基類的關鍵語,通常稱父類

__COLUMN__, __FILE__, __FUNCTION__, __LINE__

是不是有點像巨集定義啊。

println(__COLUMN__ ,__FILE__, __FUNCTION__, __LINE__)  

 

輸出:

(17, /Users/apple/Desktop/swiftDemo/swiftDemo/ViewController.swift, viewDidLoad(), 62)  

 

set,get

 

常用於類屬性的setter getter操作。

 

willSet,didSet

在swift中對set操作進行了擴展,willset 在set新值成功前發生,didset在設置新值成功後發生。

inout

對函數參數作為輸出參數進行修飾。

 

func swapTwoInts(inout a: Int, inout b: Int) {  
    let temporaryA = a  
    a = b  
    b = temporaryA  
}  

 

 

mutating

具體不是很理解,好像是專為結構體使用而設置的變體聲明

 

protocol ExampleProtocol {  
    var simpleDescription: String { get }  
    mutating func adjust()  
}  
  
class SimpleClass: ExampleProtocol {  
    var simpleDescription: String = "A very simple class."  
    func adjust() {  
        simpleDescription += "  Now 100% adjusted."  
    }  
}  
  
  
struct SimpleStructure: ExampleProtocol {  
    var simpleDescription: String = "A simple structure"  
    mutating func adjust() {                //如果去除mutating 報Could not find an overload for '+=' that accepts the supplied arguments  
        simpleDescription += " (adjusted)"  
    }  
}  

 

 

測試

func testMutating()  
{  
    var a = SimpleClass()  
    a.adjust()  
    let aDescription = a.simpleDescription  
    println(aDescription)  
      
    var b = SimpleStructure()  
    b.adjust()  
    let bDescription = b.simpleDescription  
    println(bDescription)  
}  

 

override

父子類之間的函數重寫,即覆蓋。

 

unowned, unowned(safe), unowned(unsafe)

無宿主引用。

[unowned self] 或[unowned(safe) self] 或[unowned(unsafe) self]

 

weak

弱引用,使得對象不會被持續占有

 

 

    ---

作者:fengsh998 原文地址:http://blog.csdn.net/fengsh998/article/details/32133809 轉載請註明出處
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • wiringpi2顯然也把i2c驅動帶給了Python,手頭上正巧有一個DS3231的模塊,上邊帶了一個DS3231 RTC(實時時鐘),與一片24C32,兩個晶元均為iic匯流排設備,與樹莓派接線如下: 也就是VCC GND SDA SCL四個腳分別接到樹莓派的1(3.3v)、9(0v)、3(SDA...
  • 2.1、maven父子模塊在實際開發中,我們基本都會用maven父子分模塊的方式進行項目的開發。2.2、實際操作2.2.1、手工建立一個ssmm0的文件夾,併在該文件夾中加入一個pom.xml文件,該pom.xml文件內容如下: 1 2 4 5 4.0.0 6 7 com.x...
  • 外面沙塵滾滾一直向北去了,意識到年關到了,碼農們都回鄉過年去了,而我卻留在這裡玩弄“拉鏈”。不要想歪了,我說的不是褲襠拉鏈而是scalaz Zipper,一種泛函數據結構游標(cursor)。在函數式編程模式里的集合通常是不可變的(immutable collection),我們會發現在FP編程過....
  • ThreadLocal是線程局部變數,其中保存了特定於該線程的值.每個線程都擁有一份獨立的副本值,即每個線程修改變數值不影響其他線程該變數的副本值.這些特定於線程的值保存在Thread對象中,當線程終止後,這些值會作為垃圾回收. 如果沒有看源碼可能會認為ThreadLocal內部的實現方式應該是採用...
  • 一、簡介 GPS(全球定位系統)接收機與手持機之間的數據交換格式一般都由生產廠商預設定製,其定義內容普通用戶很難知曉,且不同品牌、不同型號的GPS接收機所配置的控制應用程式也因生產廠家的不同而不同。所以,對於通用GPS應用軟體,需要一個統一格式的數據標準,以解決與任意一臺GPS的介面問題。NMEA-...
  • 一、簡介 OpenGL™ 是行業領域中最為廣泛接納的 2D/3D 圖形 API, 其自誕生至今已催生了各種電腦平臺及設備上的數千優秀應用程式。OpenGL™ 是獨立於視窗操作系統或其它操作系統的,亦是網路透明的。在包含CAD、內容創作、能源、娛樂、游戲開發、製造業、製藥業及虛擬現實等行業領域中,O...
  • Background ProcessingRZ01Job Scheduling MonitorSM36Schedule Background JobSM36WIZJob definition wizardSM37Overview of job selectionSM37BSimple version...
  • IOC:Inversion of Control(控制反轉)。IOC它所體現的並不是一種技術,而是一種思想,一種將設計好的對象交給容器來管理的思想。IOC的核心思想就體現在控制、反轉這兩個詞上面,要理解就必須要理解幾個問題: 1、誰控制誰?在傳統的開發工作中,我們一般都是主動去new一個對象,這個是...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...