Swift3.0 - 真的很簡單
Swift3.0 - 數據類型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可選值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 對象和類
Swift3.0 - 屬性
Swift3.0 - 函數和閉包
Swift3.0 - 初始化和釋放
Swift3.0 - 協議protocol
Swift3.0 - 類和結構體的區別
Swift3.0 - 枚舉
Swift3.0 - 擴展
Swift3.0 - 下標
Swift3.0 - 泛型
Swift3.0 - 異常錯誤
Swift3.0 - 斷言
Swift3.0 - 自動引用計數(strong,weak,unowned)
Swift3.0 - 檢測API
Swift3.0 - 對象的標識
Swift3.0 - 注釋
Swift3.0 - 元類型
Swift3.0 - 空間命名
Swift3.0 - 對象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 類簇
Swift3.0 - 動態調用對象(實例)方法
Swift3.0 - 文本輸出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 鏡像
Swift3.0 - 遇到的坑
Swift源碼下載地址
中文翻譯文檔 https://github.com/numbbbbb/the-swift-programming-language-in-chinese
基本數據類型
- 使用let定義常量
let myConstant = 42
*使用var 定義變量
var myVariable = 42
myVariable = 50
- 有初始化你可以指定變量類型或者讓系統自己去推斷
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
- 沒有初始化,你要必須指定變量類型
var numb:Double
- 在swift 中字符串是基本類型
let label = "The width is "
let width = 94
- 如何實現數據之間的相互轉換
let width = 94
let widthLabel:String = String(width)
- 使用最簡單的方式將其他數據類型編程字符串
let apples = 3
let oranges = 5
let fruitSummary = "I have \\(apples + oranges) pieces of fruit."
- 數組也是基本類型,不再是OC中引用類型
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
- 如何定義一個空數組
let emptyArray = [String]()
let emptyArray:[String] = []
- 字典也是基本類型
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
- 將數組清空
var shopingList1 = ["1","2"]
shopingList1 = [] // 如果你這個類型,是系統可以推斷的類型,你可以這樣清空數組或者初始化
- 定義一個空字典
let emptyDictionary = [String: Float]()
let emptyDictionary:[String: Float] = [:]
- 清空字典
var dictionary = [1:"2"]
dictionary = [:]
可選值
let nickName: String? = nil
"?" 這個簡單意思,你的變量可能為nil,或者你可能將nil賦值給它,需要給變量定義的時候加上"?",否則一旦你將nil賦值給沒有加"?"的變量,編譯就會報錯
舉個例子理解一下,我們假如有一個盒子,盒子是一個存在的物體,swift不允許有空值出現,那我們怎么辦呢?就需要把空值裝到一個盒子里面,系統檢查的時候,發現有一個盒子,哦,好的,檢測通過,但是如果你把盒子打開系統就會報錯
運行下面的代碼:
let nickName: String? = "酷走天涯"
print(nickName)
結果:
Optional("酷走天涯")
發現有個Optional 就說明這個變量被包著,那么怎么才能不讓它包裹著呢? 很簡單, 給變量加一個"!"
print(nickName!)
運行:
酷走天涯
我們還有一種解包的方式
let nickName: String? = nil
let fullName: String = "XUJIE"
let informalGreeting = "Hi \\(nickName ?? fullName)"
print(informalGreeting)
運行
Hi XUJIE
如果第一個解包值發現為nil,則使用第二值
控制流
- for ... in 循環
// 遍歷數組
let individualScores = [75, 43, 103, 87, 12]
var teamScore = 0
for score in individualScores {
if score > 50 {
teamScore += 3
} else {
teamScore += 1
}
}
print(teamScore)
// 遍歷 字典
let interestingNumbers = [
"Prime": [2, 3, 5, 7, 11, 13],
"Fibonacci": [1, 1, 2, 3, 5, 8],
"Square": [1, 4, 9, 16, 25],
]
var largest = 0
for (kind, numbers) in interestingNumbers {
for number in numbers {
if number > largest {
largest = number
}
}
}
// 還可以這樣使用循環
var total = 0
for i in 0..<4 {
total += i
}
print(total)
- Switch
let vegetable = "red pepper"
switch vegetable {
case "celery":
print("Add some raisins and make ants on a log.")
case "cucumber", "watercress":
print("That would make a good tea sandwich.")
case let z where z.hasSuffix("pepper"):
print("Is it a spicy \\(z)?")
default:
print("Everything tastes good in soup.")
}
注意 z 什么 隨便寫個變量名就可以了
- while 循環
var n = 2
while n < 100 {
n = n * 2
}
print(n)
- repeat ...while
var m = 2
repeat {
m = m * 2
} while m < 100
print(m)
函數和閉包
*定義函數
func greet(person: String, day: String) -> String {
return "Hello \\(person), today is \\(day)."
}
greet(person: "Bob", day: "Tuesday")
- 缺省參數名
func greet(_ person: String, _ day: String) -> String {
return "Hello \\(person), today is \\(day)."
}
greet("John", "Wednesday")
- 返回值可以是元祖類型
func calculateStatistics(scores: [Int]) -> (min: Int, max: Int, sum: Int) {
var min = scores[0]
var max = scores[0]
var sum = 0
for score in scores {
if score > max {
max = score
} else if score < min {
min = score
}
sum += score
}
return (min, max, sum)
}
let statistics = calculateStatistics(scores: [5, 3, 100, 3, 9])
print(statistics.sum)
print(statistics.2)
- 定義多個類型相同的參數
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
sum += number
}
return sum
}
sumOf()
sumOf(numbers: 42, 597, 12)
- 函數嵌套使用
func returnFifteen() -> Int {
var y = 10
func add() {
y += 5
}
// 方法內部定義方法,聲明周期為方法
add()
return y
}
returnFifteen()
- 函數當返回值
func makeIncrementer() -> ((Int) -> Int) {
func addOne(number: Int) -> Int {
return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
- 函數當參數
func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false
}
func lessThanTen(number: Int) -> Bool {
return number < 10
}
var numbers = [20, 19, 7, 12]
hasAnyMatches(list: numbers, condition: lessThanTen)
對象和類
- 定義一個類
class Shape {
var numberOfSides = 0
func simpleDescription() -> String {
return "A shape with \\(numberOfSides) sides."
}
}
- 初始化方法,和對象方法
class NamedShape {
var numberOfSides: Int = 0
var name: String
// 初始化方法
init(name: String) {
self.name = name
}
// 成員方法定義
func simpleDescription() -> String {
return "A shape with \\(numberOfSides) sides."
}
}
- 繼承
class Square: NamedShape {
var sideLength: Double // 如果不是可選類型 必須在初始化方法中初始化
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name) // 調用父類的初始化方法
numberOfSides = 4 // 給父類的屬性賦值之前必須先調用父類的初始化方法
}
func area() -> Double {
return sideLength * sideLength
}
// 重寫父類的方法
override func simpleDescription() -> String {
return "A square with sides of length \\(sideLength)."
}
}
- setter 和 getter
class EquilateralTriangle: NamedShape {
var sideLength: Double = 0.0 // 定一個屬性
init(sideLength: Double, name: String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSides = 3
}
// 這個是setter 和geterr方法的定義
var perimeter: Double {
get {
return 3.0 * sideLength
}
set {
sideLength = newValue / 3.0
}
}
override func simpleDescription() -> String {
return "An equilateral triangle with sides of length \\(sideLength)."
}
}
- 觀察屬性
class TriangleAndSquare {
// 定一個三角形對象
var triangle: EquilateralTriangle {
willSet {
square.sideLength = newValue.sideLength
}
}
// 定一個一個正方形對象
var square: Square {
willSet {
triangle.sideLength = newValue.sideLength
}
}
// 通過檢測屬性,我們讓兩個對象的邊保持一樣長
init(size: Double, name: String) {
square = Square(sideLength: size, name: name)
triangle = EquilateralTriangle(sideLength: size, name: name)
}
}
var triangleAndSquare = TriangleAndSquare(size: 10, name: "another test shape")
print(triangleAndSquare.square.sideLength)
print(triangleAndSquare.triangle.sideLength)
triangleAndSquare.square = Square(sideLength: 50, name: "larger square")
print(triangleAndSquare.triangle.sideLength)
運行結果
10.0
10.0
50.0
枚舉類型
- 定義
enum Rank: Int { // Int 設置枚舉值的類型
// 定義枚舉值設置值
case ace = 1
// 可以case 后面一次定義多個枚舉值
case two, three, four, five, six, seven, eight, nine, ten
case jack, queen, king
// 定義函數 如果多人合作的時候,可以使用這個讓別人更加了解你定義的屬性的含義
func simpleDescription() -> String {
switch self { // self 就是這個枚舉本身
case .ace:
return "ace"
case .jack:
return "jack"
case .queen:
return "queen"
case .king:
return "king"
default:
return String(self.rawValue)
}
}
}
// 使用
let ace = Rank.ace
let aceRawValue = ace.rawValue
問題1 如何想OC 一樣使用 | 或操作呢?
結構體
- 定義
struct Card {
// 定義結構體
var rank: Rank
var suit: Suit
// 結構體內可以定義方法
func simpleDescription() -> String {
return "The \\(rank.simpleDescription()) of \\(suit.simpleDescription())"
}
}
- 使用
let threeOfSpades = Card(rank: .three, suit: .spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()
協議
- 定義
protocol ExampleProtocol {
var simpleDescription: String { get }
mutating func adjust()
}
- 給類添加協議
class SimpleClass: ExampleProtocol {
var simpleDescription: String = "A very simple class."
var anotherProperty: Int = 69105
func adjust() {
simpleDescription += " Now 100% adjusted."
}
}
- 給結構體添加協議
struct SimpleStructure: ExampleProtocol {
var simpleDescription: String = "A simple structure"
mutating func adjust() {
simpleDescription += " (adjusted)"
}
}
- 定義一個協議變量
let protocolValue: ExampleProtocol = a
print(protocolValue.simpleDescription)
擴展
例子:給Int 添加一個協議
extension Int: ExampleProtocol {
var simpleDescription: String {
return "The number \\(self)"
}
mutating func adjust() {
self += 42
}
}
print(7.simpleDescription)
錯誤操作
- 定義一個錯誤枚舉
enum PrinterError: Error {
case outOfPaper
case noToner
case onFire
}
- 定義一個有異常處理能力的函數
func send(job: Int, toPrinter printerName: String) throws -> String {
if printerName == "Never Has Toner" {
throw PrinterError.noToner
}
return "Job sent"
}
- 捕捉異常
do {
let printerResponse = try send(job: 1040, toPrinter: "Bi Sheng")
print(printerResponse)
} catch {
print(error)
}
- 異常分類處理
do {
let printerResponse = try send(job: 1440, toPrinter: "Gutenberg")
print(printerResponse)
} catch PrinterError.onFire {
print("I'll just put this over here, with the rest of the fire.")
} catch let printerError as PrinterError {
print("Printer error: \\(printerError).")
} catch {
print(error)
}
總結
Swift 的基本語法已經了解完畢,但這只是些簡單的東西,如果Swift只是這些東西,那我們就沒有學習的必要了,Swift的靈活性,優秀的設計模式,從上面的內容體現不出來,我會在后面幾篇文章中,闡述它的高級用法!
我的博客即將搬運同步至騰訊云+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=3i4a1yo68wsg0