Swift基本語法

Swift基本語法
原文:Swift基本語法

Swift基本語法

?

簡介

1.什么是Swift

Swift是蘋果于2014年WWDC(蘋果開發者大會)發布的全新編程語言

Swift在天朝譯為“雨燕”

跟Objective-C一樣,可以用于開發iOS、Mac應用程序

蘋果從2010年7月開始設計Swift語言,耗時4年打造

?

2.Swift的語法特點

從它的語法中能看到Objective-C、JavaScript、Python等語言的影子

語法簡單、代碼簡潔、使用方便

可與Objective-C混合使用(相互調用)

?

3.為什么要設計Swift語言

讓應用開發更簡單、更快、更穩定

確保最終應用有著更好的質量

?

編程語言對比

腳本語言(比如Python)

通常易于編寫和測試,不需要經歷編譯-鏈接-運行三個繁瑣的步驟

但并不是非常強大,難以帶來高質量程序

如果你希望編寫一款游戲,完全利用設備的性能,那么這樣的語言并不理想

?

傳統編程語言(比如Objective-C)

使開發者能更好地利用設備的性能,開發更復雜的應用

但通常較難掌握,在編譯和測試時也更麻煩(經歷編譯-鏈接-運行三個步驟)

?

Swift

借鑒了Objective-C、JavaScript、Python等語言的優點

目標:簡單、高效、強大

?

相關數據

Xcode版本必須 >= 6.0,才能使用Swift進行調試和開發

?

Swift自從發布之后,備受開發者關注,1天的時間內

Xcode 6 beta下載量突破1400萬次

官方發布的電子書《The Swift Programming Language》下載量突破37萬次

一位國外開發者已經用Swift實現了Flappy Bird游戲(這位開發者上手Swift的時間只有4個小時,編程加上休息時間,接近9個小時)

?

語法須知

2個不需要

不需要編寫main函數:全局作用域中的代碼會被自動當做程序的入口點(從上往下執行)

不需要在每一條語句后面加上分號 ? ?

let radius = 10

你喜歡的話,也可以加上? ? let radius = 10;

有一種情況必須加分號:同一行代碼上有多條語句時

let radius = 10;? ? let radius2 = 15

?

注釋

單行注釋// 這是單行注釋

多行注釋 /* 這是多行注釋 */?

跟其他語言不太一樣的是,Swift的多行注釋可以嵌套多行注釋

/* haha /* hehe */ haha */

?

常量和變量

如何聲明常量和變量

用let來聲明常量

let radius = 10

?

用var來聲明變量

var age = 20

var x = 0.0, y = 0.0, z = 0.0

?

常量和變量的命名

基本上可以用任何你喜歡的字符作為常量和變量名

let π = 3.14159

let網址 = "http://ios.itcast.cn"

let?? = "dogcow"

// ?和?是一種特殊的Unicode字符

?

常量和變量名的注意點

不能包含數學符號(比如 + 和 * )

不能包含箭頭(比如↑、↓、←、→)

不能包含非法無效的Unicode字符(比如? 、?)

不能是關鍵字(比如let、var)

不能包含橫線 – 、 制表符(比如 my–name)

不能以數字開頭(比如 123go)

不能是單獨一個下劃線 _ (比如var_ = 10)

?

數據類型

Swift中常用的數據類型有

Int、Float、Double、Bool

String、Character、Array、Dictionary

可以看出,數據類型的首字母都是大寫的

?

如何指定變量\常量的數據類型

在常量\變量名后面加上“冒號:” 和 “類型名稱”

var age : Int = 10

上面代碼表示:定義了一個Int類型的變量age,初始值是10

?

一般來說,沒有必要明確指定變量\常量的類型

如果在聲明常量\變量時賦了初始值,Swift可以推斷出這個常量\變量的類型

var age = 20// Swift會推斷出age是Int類型,因為20是個整數

?

整數

整數分為2種類型

有符號(signed):正、負、零

無符號(unsigned):正、零

?

Swift提供了8、16、32、64位的有符號和無符號整數,比如

UInt8 :8位無符號整型

Int32 :32位有符號整型

?

整數的最值

可以通過min和max屬性來獲取這個類型的最小值和最大值

let minValue = UInt8.min? // UInt8 類型的 minValue 等于0

let maxValue = UInt8.max? // UInt8 類型的 maxValue 等于255

?

Int和UInt

Swift提供了特殊的有符號整數類型Int和無符號整數類型UInt

Int\UInt的長度和當前系統平臺一樣

在32位系統平臺上,Int和UInt的長度是32位

在64位系統平臺上,Int和UInt的長度是64位

Int在32位系統平臺的取值范圍:-2147483648 ~ 2147483647

?

建議

在定義變量時,別總是在考慮有無符號、數據長度的問題

盡量使用Int,這樣可以保證代碼的簡潔、可復用性

?

存儲范圍

每種數據類型都有各自的存儲范圍

Int8的存儲范圍是:–128 ~ 127

UInt8的存儲范圍是:0 ~ 255

?

如果數值超過了存儲范圍,編譯器會直接報錯

下面的語句都會直接報錯

let num1 : UInt8 = -1

// UInt8不能存儲負數

let num2 : Int8 = Int8.max + 1

// Int8能存儲的最大值是Int8.max

?

整數的表示形式

整數的4種表示形式

十進制數:沒有前綴

var i1 = 10 // 10

?

二進制數:以0b為前綴

var i2 = 0b1010 // 10

?

八進制數:以0o為前綴

var i3 = 0o12 // 10

?

十六進制數:以0x為前綴

var i4 = 0xA // 10

?

類型別名

可以使用typealias關鍵字定義類型的別名,跟C語言的typedef作用類似

typealias MyInt = Int

// 給Int類型起了個別名叫做MyInt

?

原類型名稱能用在什么地方,別名就能用在什么地方

聲明變量類型

var num : MyInt = 20

?

獲得類型的最值

var minValue = MyInt.min

?

類型轉換

var num2 = MyInt(3.14) // 3

?

浮點數

浮點數,就是小數。Swift提供了兩種浮點數類型

Double :64位浮點數,當浮點值非常大或需要非常精確時使用此類型

Float :32位浮點數,當浮點值不需要使用Double的時候使用此類型

?

精確程度

Double :至少15位小數

Float :至少6位小數

?

如果沒有明確說明類型,浮點數默認就是Double類型

let num = 0.14// num是Double類型的常量

?

浮點數的表示形式

浮點數可以用 十進制 和 十六進制 2種進制來表示

十進制(沒有前綴)

沒有指數:var d1 = 12.5

有指數? ? :var d2 = 0.125e2 ?

// 0.125e2 == 0.125 * 102

MeN ==? M * 10的N次方

?

十六進制(以0x為前綴,且一定要有指數)

var d3 = 0xC.8p0?

// 0xC.8p0 == 0xC.8 * 2o == 12.5 * 1

0xMpN == 0xM * 2的N次方

var d3 = 0xC.8p1?

?

數字格式

數字可以增加額外的格式,使它們更容易閱讀

可以增加額外的零 0

let money = 001999// 1999

let money2 = 001999.000// 1999.0

?

可以增加額外的下劃線 _ ,以增強可讀性

let oneMillion1 = 1_000_000// 1000000

let oneMillion2 = 100_0000// 1000000

let overOneMillion = 1_000_000.000_001// 1000000.000001

?

增加了額外的零? 0和下劃線 _ ,并不會影響原來的數值大小

?

類型轉換

下面的語句是錯誤的

let num1 = 3// num1是Int類型

let num2 = 0.14// num2是Double類型

let sum = num1 + num2 // 這行會報錯

// 只有將num1轉為Double類型,才能與num2進行相加

?

下面的語句是正確的

let sum = Double(num1) + num2

?

注意

下面的寫法是正確的

let sum = 3 + 0.14

// 等3和0.14相加得到結果3.14后,編譯器才會自動推斷出sum是Double類型

?

字符串

字符串是String類型的數據,用雙引號""包住文字內容

var website = "http://ios.itcast.cn"

?

字符串的常見操作

用加號 + 做字符串拼接

var scheme = "http://"

var path = "ios.itcast.cn"

var website = scheme + path

// website的內容是"http://ios.itcast.cn"

?

用反斜線 \ 和 小括號 () 做字符串插值(把常量\變量插入到字符串中)

let hand = 2

var age = 20

var str = "我今年\(age)歲了,有\(hand)只手"

// str的內容是"我今年20歲了,有2只手"

?

打印輸出

Swift提供了2個打印輸出函數

println :輸出內容后會自動換行

print :對比println,少了個自動換行的功能

?

示例

輸出字符串

println("歡迎學習傳智播客iOS學院Swift教程")

var name = "傳智播客iOS學院\n"

print(name)

?

輸出其他數據類型

var age = 7

println(age)

println("我今年\(age)歲")

?

元組類型

什么元組類型

元組類型由 N個 任意類型的數據組成(N>=0)

組成元組類型的數據可以稱為“元素”

var position = (x : 10.5, y : 20)?

// position有2個元素,x、y是元素的名稱

var person = (name : "jack") // person只有name一個元素

?

元素的訪問

用元素名稱

position.x

position.y

?

用元素位置

position.0? // 相當于postion.x

position.1? // 相當于postion.y

?

元組類型的細節

可以省略元素名稱

var position = (10, 20)

var person = (20, "jack")

?

可以明確指定元素的類型

var person : (Int, String) = (23, "rose")

注意o

在明確指定元素類型的情況下不能加上元素名稱

因此,下面的語句是錯誤的

var person : (Int, String) = (age : 23, name : "rose")

?

可以用多個變量接收元組數據

var (x , y) = (10, 20) // x是10,y是20

var point = (x, y) // point由2個元素組成,分別是10和20

?

元組類型的細節

可以將元素分別賦值給多個變量

var point = (10, 20)

var (x , y) = point

// x是10,y是20

?

可以使用下劃線 _ 忽略某個元素的值,取出其他元素的值

var person = (20, "jack")

var (_, name) = person

// name的內容是“jack”,person中的元素20被忽略

?

可選類型

可選類型的使用場合

當一個值可能存在,可能不存在的時候,就用可選類型

比如查找字符k在某個字符串中的位置

如果字符串是"jake",說明k的位置存在,是2

如果字符串是"kate",說明k的位置存在,是0

如果字符串是"itcast",說明k的位置不存在

那么k的位置就應該用可選類型

?

可選類型的格式:類型名?

var kIndex : Int?

問號?表明kIndex的值是可選的,可能是一個Int,也可能值不存在

kIndex的值要么是Int類型,要么是nil(nil代表值不存在)

kIndex默認就是nil,因此上面的語句相當于

var kIndex : Int? = nil

?

可選類型的應用

String有個toInt方法,可以將字符串轉為對應的整數

有些字符串能轉成整數,比如"156",可以返回156

有些字符串不能轉成整數,比如"itcast",無法返回整數

因此toInt方法的返回值是一個可選的Int類型(即Int?)

字符串能轉成整數,比如"156",就返回156

字符串不能轉成整數,比如"itcast",說明返回的整數值不存在,是nil

let num = "156".toInt() // 156

let num2 = "itcast".toInt() // nil

注意:num和num2都是Int?類型,不是Int類型

?

?

可選類型的注意

注意

不能直接將可選類型賦值給具體類型

比如不能將Int?類型直接賦值給Int類型,因為Int?都不確定有沒有整數值

下面的寫法是錯誤的

var num : Int? = 10

var numValue : Int = num // 這行會報錯

?

相反,可以直接將Int類型賦值給Int?類型

下面的寫法是正確的

var numValue : Int = 20

var num : Int? = numValue?

?

強制解包

在可選類型的后面加個感嘆號!,就可以把可選類型的值取出來,賦值給具體類型

下面的寫法是正確的

var num : Int? = 10

var numValue : Int = num!

// 將num中的值取出來,賦值給numValue

感嘆號!的意思是告訴編譯器:我確定可選類型里面有值,可以將值取出來了

?

基本概念

解包:將可選類型的值取出來

強制解包:使用感嘆號!將可選類型的值取出來

?

?

強制解包的注意

注意

如果可選類型的值不存在,仍然進行強制解包,會報一個錯誤

fatal error: Can't unwrap Optional.None

?

下面的代碼是錯誤的

var num : Int?

var numValue = num! // 這行會報錯

?

因此:在進行強制解包之前,一定要先檢測可選類型的值是否存在

?

?

可選類型和if

可以使用if語句來檢測一個可選類型的值是否存在

如果值存在,就返回true

如果值不存在,就返回false

let num = "156".toInt()

ifnum {

? ? println("num的值是\(num!)")

} else {

? ? println("num的值不存在")

}

?

可選類型的價值

可選類型讓開發人員可以在程序運行時,檢測一個值是否存在

然后使用代碼來分別處理存在和不存在的情況

?

選擇綁定

選擇綁定的作用

用來確定一個可選類型的值是否存在

如果值存在,把該值賦給一個臨時常量\變量

如果值不存在,就不創建任何臨時常量\變量

?

選擇綁定的概念

可選類型的值有選擇地賦給臨時常量\變量

也可以稱為“選擇綁定解包”

?

選擇綁定的使用場合

if\while語句

?

選擇綁定的應用

iflet num = "156".toInt() {

? ? println("num的值存在,是\(num)")

} else {

? ? println("num的值不存在")

}

如果"156".toInt()的值存在

就把值賦給臨時常量num,執行第1 ~ 3行的大括號之間的代碼

如果"156".toInt()的值不存在

就不創建臨時常量num,執行第3 ~ 5行的大括號之間的代碼

注意

這里的num是Int類型,不是Int?類型

num的作用域是第1~3行的大括號之間,不能用在第3~5行的大括號之間

也可以用臨時變量來存儲

ifvar num = "156".toInt() {?

} else { }

?

?

隱式解包

默認情況下:如果想將可選類型的值賦給具體類型,比如將Int?的值賦給Int類型,需要使用感嘆號!進行強制解包

var num : Int? = 10

var numValue : Int = num!

?

被聲明為隱式解包的可選類型

不用進行強制解包

能夠自動解包:自動把可選類型的值取出來賦給具體類型

?

如何聲明一個隱式解包的可選類型

將 問號? 改為 感嘆號! 即可

var num : Int! = 20

var numValue : Int = num// 自動解包,不用再使用 ! 進行強制解包

// num是被聲明為隱式解包的可選類型Int!

?

隱式解包的原理和應用

隱式解包的原理

相當于告訴編譯器:這個可選類型的值一直都存在,絕對能取出里面的值

所以取值時可以不用加感嘆號!,能夠自動解包

?

隱式解包的應用

如果某個常量\變量的值,在有些情況下一定存在,就可以用隱式解包

比如銀行卡的余額就可以聲明為隱式解包的可選類型

只要開通了銀行卡,銀行卡的余額肯定有值,從0 ~ 無限大

如果沒開通銀行卡或者銀行卡丟了,銀行卡的余額就沒有值,因為連卡都沒有

?

?

斷言

斷言是一種實時檢測條件是否為true的方法

如果條件為true,那么代碼繼續執行

如果條件為false,就拋出錯誤信息,直接終止程序的運行

?

斷言的用法

使用全局的assert函數

assert函數接收一個Bool表達式和一個斷言失敗時顯示的消息

assert(index >= 0, "index必須大于0")

如果index大于等于0,就繼續執行后面的代碼

如果index小于0,就拋出錯誤信息(下面的黑色字),直接終止程序的運行

assertion failed: index必須大于0

?

assert(index >= 0)

可以省略錯誤信息,但不推薦,這樣不利于調試

?

posted on 2014-06-11 22:36 NET未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/3782911.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375799.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375799.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375799.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2018華工計算機應用基礎作業,計算機應用基礎平時作業2019

計算機應用基礎平時作業2019Tag內容描述:1、1.簡述啟動控制面板的常用方法。(至少列出三種) 答:常用打開控制面板的方法:1)點開始,選擇控制面板打開;2)打開我的電腦,選擇控制面板;3)點開始運行&…

計算機系統組織結構,第4章 操作系統計算機組織結構.ppt

第4章 操作系統計算機組織結構第4章 計算機組織結構 前言 操作系統提供了抽象以簡化對硬件的使用,單線程是馮?諾依曼計算機的操作抽象,如果理解了一個馮?諾依曼計算機是如何執行程序的,就能理解進程背后的知識,對操作系統的深入…

Solution 19: Fibonacci數列

問題描述 求Fibonacci數列的第n項。Fibonacci數列為1,1,2,3,5,... 解決思路 (1) 遞歸,指數級時間復雜度; (2) 循環,O(n)時間復雜度; (3) 矩陣乘法,O(logn)時間復雜度; (4) 公式法,O(1)時間復雜度…

boost::unordered_map 和 std::map 的效率 與 內存比較

例子鏈接:http://blog.csdn.net/gamecreating/article/details/7698719 結論: unordered_map 查找效率快五倍,插入更快,節省一定內存。如果沒有必要排序的話,盡量使用 hash_map(unordered_map 就是 boost 里面的 hash_map 實現)。…

軟件可靠性指標mtbf測試評估,軟件可靠性評估.pdf

軟件可靠性評估軟件可靠性工程基礎——軟件可靠性評估北京航空航天大學可靠性與系統工程學院目的? 理解什么是軟件可靠性評估,基本原理? 掌握和應用典型的軟件可靠性模型? 了解比較軟件可靠性模型的主要方法? 理解穩定使用階段的軟件可靠性評估? 理解增長測試中…

模型和控制器-起步階段

MVVM簡介 針對客戶端應用開發AngularJS吸收了傳統的MVC基本原則。MVC(Model-View-Controll)設計模式針對不同的人可能意味不同的東西 ,AngularJS并不執行傳統意義上的MVC,更接近于MVVM。 MVVM模式是Model-View-ViewMode模式的簡稱。由視圖(View)、視圖模型(ViewMode…

Apache開啟Gzip壓縮

1. 編輯Apache的httpd.conf文件 vim /etc/httpd/conf/httpd.conf 2. 開啟mod_deflate.so模塊 LoadModule deflate_module modules/mod_deflate.so 3. 對該模塊進行配置 # ShiftG到最下一行添加如下內容<IfModule mod_deflate.c> # 壓縮等級 9 DeflateCompressionLevel 9 …

計算機的網絡與結構,計算機結構與組成29-網絡.ppt

計算機結構與組成29-網絡CS61C L221 Performance ? UC Regents I/O Review I/O gives computers their 5 senses I/O speed range is 12.5-million to one Differences in processor and I/O speed ? synchronize with I/O devices before use Polling works, but expensive …

Canvas動畫 位圖緩存提高效率和對應的內存問題

對一個矢量圖動畫&#xff0c;開啟位圖緩存能大大提高運行效率。所謂開啟位圖緩存&#xff0c;其實要自己動手&#xff0c;先創建一個臨時canvas&#xff0c;然后把矢量圖繪制到這個canvas上&#xff0c;到了實際繪制時&#xff0c;直接把這個臨時canvas拷貝到真正canvas上。而…

ASP.NET MVC 學習第一天

今天開始第一天學習asp.net mvc&#xff0c;寫的不是很好&#xff0c;高手不要噴&#xff0c;希望大家能一起進步學習。 好了&#xff0c;開始學習 新建項目&#xff0c;選擇mvc 4應用程序 接下來選擇基本&#xff0c;視圖引擎當然要選擇Razor&#xff0c;如果在選擇aspx那我們…

python提取字符串中的數字

字符串存儲在string.txt中&#xff0c;將字符串中的數字提取出來&#xff0c;組成心得字符串&#xff0c;并打印輸出。 #!/usr/bin/env python3 fileopen(/home/user/string.txt) file_contextfile.read() i0 string while i < len(file_context):if file_context[i].isdig…

計算機顯示發送報告,Word文檔打不開提示發送錯誤報告的解決方法

經常使用word文檔的人員都會碰到過這種發送錯誤報告情況&#xff0c;既然有這個問題就要查個究竟什么原因造成&#xff0c;才能完美解決&#xff0c;那么今天小編就在這里講解word文檔發送錯誤報告的方法。根本原因是&#xff1a;打開word出現提示word發送錯誤報告的故障其主要…

asp.net mvc 如何在View中獲取Url參數的值

如果url是 /home/index?id3 直接Request就ok。 但是如果路由設定為&#xff1a;{controller}/{action}/{id} url是 /home/index/3 這時想在頁面View中獲取參數id的值&#xff0c;該怎么獲取&#xff1f; 查了下資料好多人都利用Action獲取到參數值后&#xff0c;用Viewdata…

js 控制

js 制動控制 代碼 是 :setInterval(function(){$(".egg").click();},1000); 使用方法&#xff1a;調出瀏覽器放控制臺(console)&#xff0c;一般是按F12&#xff0c;將上述代碼粘貼后回車就可以自動運行了。轉載于:https://www.cnblogs.com/Look_Sun/p/3798903.htm…

python讀取文本文件的三種方法

參考鏈接 python讀取文本文件的內容&#xff0c;有三種方法。 read()、readline()、readlines() read() read()是最簡單的一種方法&#xff0c;一次性讀取文件的所有內容放在一個大字符串中&#xff0c;即內存中。 fileopen(test.txt) try:file_contextfile.read() #file…

圖靈計算機模型意義,圖靈機有什么意義_學習圖靈機模型中遇到的問題

圖靈機意義圖靈提出圖靈機的模型并不是為了同時給出計算機的設計&#xff0c;它的意義我認為有如下幾點&#xff1a;1、它證明了通用計算理論&#xff0c;肯定了計算機實現的可能性&#xff0c;同時它給出了計算機應有的主要架構&#xff1b;2、圖靈機模型引入了讀寫與算法與程…

使用MVVM-Sidekick開發Universal App(一)

終于要邁進Universal的大坑了&#xff0c;還有點小激動呢。 CurrencyExchanger 掌中匯率是我前幾年發布在Windows Phone商店中的一個應用&#xff0c;當時是WP7版本&#xff0c;下載鏈接&#xff1a;http://www.windowsphone.com/zh-cn/store/app/%E6%8E%8C%E4%B8%AD%E6%B1%87%…

NewCode----給定兩個數R和n,輸出R的n次方

參考鏈接 輸入描述: 多組測試用例&#xff0c;請參考例題的輸入處理 輸入每行一個浮點數 R 其中0.0 < R <99.999&#xff0c; 一個整數 n 其中0 < n <25 輸出描述: 輸出R的n次方 輸入例子1: 95.123 12 0.1 1 輸出例子1: 548815620517731830194541.89902534…

如何檢測本計算機耗電量,如何查看電腦耗電量?魯大師查看電腦使用功率的方法...

【www.xinr41319.cn--電腦網絡】查看自己電腦的電源功率有兩大好處&#xff0c;第一知道給臺式電腦配置多大的電源&#xff0c;第二可以精確的算出&#xff0c;一臺電腦&#xff0c;一天一般消耗多少電&#xff0c;那么小編教大家來查看一下自己電腦的功率是多少。我們可以要借…

【轉載】COM小結

原文&#xff1a;http://blog.csdn.net/byxdaz/article/details/6595210 一、Com概念 所謂COM&#xff08;Componet Object Model&#xff0c;組件對象模型&#xff09;&#xff0c;是一種說明如何建立可動態互變組件的規范&#xff0c;此規范提供了為保證能夠互操作&#xff0…