Swift3.0 - 真的很簡單

Swift3.0 - 真的很簡單
Swift3.0 - 數(shù)據(jù)類型
Swift3.0 - Array
Swift3.0 - 字典
Swift3.0 - 可選值
Swift3.0 - 集合
Swift3.0 - 流控制
Swift3.0 - 對象和類
Swift3.0 - 屬性
Swift3.0 - 函數(shù)和閉包
Swift3.0 - 初始化和釋放
Swift3.0 - 協(xié)議protocol
Swift3.0 - 類和結(jié)構(gòu)體的區(qū)別
Swift3.0 - 枚舉
Swift3.0 - 擴展
Swift3.0 - 下標
Swift3.0 - 泛型
Swift3.0 - 異常錯誤
Swift3.0 - 斷言
Swift3.0 - 自動引用計數(shù)(strong,weak,unowned)
Swift3.0 - 檢測API
Swift3.0 - 對象的標識
Swift3.0 - 注釋
Swift3.0 - 元類型
Swift3.0 - 空間命名
Swift3.0 - 對象判等
Swift3.0 - 探究Self的用途
Swift3.0 - 類簇
Swift3.0 - 動態(tài)調(diào)用對象(實例)方法
Swift3.0 - 文本輸出
Swift3.0 - 黑魔法swizzle
Swift3.0 - 鏡像
Swift3.0 - 遇到的坑

讓學習成為一種習慣

Swift源碼下載地址

中文翻譯文檔 https://github.com/numbbbbb/the-swift-programming-language-in-chinese


基本數(shù)據(jù)類型

  • 使用let定義常量
let myConstant = 42

*使用var 定義變量

var myVariable = 42
myVariable = 50
  • 有初始化你可以指定變量類型或者讓系統(tǒng)自己去推斷
let implicitInteger = 70
let implicitDouble = 70.0
let explicitDouble: Double = 70
  • 沒有初始化,你要必須指定變量類型
var numb:Double 
  • 在swift 中字符串是基本類型
let label = "The width is "
let width = 94
  • 如何實現(xiàn)數(shù)據(jù)之間的相互轉(zhuǎn)換
let width = 94
let widthLabel:String = String(width)
  • 使用最簡單的方式將其他數(shù)據(jù)類型編程字符串
let apples = 3
let oranges = 5
let fruitSummary = "I have \\(apples + oranges) pieces of fruit."
  • 數(shù)組也是基本類型,不再是OC中引用類型
var shoppingList = ["catfish", "water", "tulips", "blue paint"]
shoppingList[1] = "bottle of water"
  • 如何定義一個空數(shù)組
 let emptyArray = [String]()
 let emptyArray:[String] = []
  • 字典也是基本類型
var occupations = [
"Malcolm": "Captain",
"Kaylee": "Mechanic",
]
  • 將數(shù)組清空
 var shopingList1 = ["1","2"]
 shopingList1 = [] // 如果你這個類型,是系統(tǒng)可以推斷的類型,你可以這樣清空數(shù)組或者初始化
  • 定義一個空字典
let emptyDictionary = [String: Float]()
let emptyDictionary:[String: Float] = [:]
  • 清空字典
var dictionary = [1:"2"]
dictionary = [:]

可選值

let nickName: String? = nil 

"?" 這個簡單意思,你的變量可能為nil,或者你可能將nil賦值給它,需要給變量定義的時候加上"?",否則一旦你將nil賦值給沒有加"?"的變量,編譯就會報錯
舉個例子理解一下,我們假如有一個盒子,盒子是一個存在的物體,swift不允許有空值出現(xiàn),那我們怎么辦呢?就需要把空值裝到一個盒子里面,系統(tǒng)檢查的時候,發(fā)現(xiàn)有一個盒子,哦,好的,檢測通過,但是如果你把盒子打開系統(tǒng)就會報錯

運行下面的代碼:

let nickName: String? = "酷走天涯"
print(nickName)

結(jié)果:

Optional("酷走天涯")

發(fā)現(xiàn)有個Optional 就說明這個變量被包著,那么怎么才能不讓它包裹著呢? 很簡單, 給變量加一個"!"

print(nickName!)

運行:

酷走天涯


我們還有一種解包的方式

let nickName: String? = nil
let fullName: String = "XUJIE"
let informalGreeting = "Hi \\(nickName ?? fullName)"
print(informalGreeting)

運行
Hi XUJIE

如果第一個解包值發(fā)現(xiàn)為nil,則使用第二值

控制流

  • for ... in 循環(huán)
// 遍歷數(shù)組
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
        }
    }
 }
 // 還可以這樣使用循環(huán)
  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 循環(huán)
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)

函數(shù)和閉包

*定義函數(shù)

func greet(person: String, day: String) -> String {
return "Hello \\(person), today is \\(day)."
}
greet(person: "Bob", day: "Tuesday")
  • 缺省參數(shù)名
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)
  • 定義多個類型相同的參數(shù)
func sumOf(numbers: Int...) -> Int {
var sum = 0
for number in numbers {
    sum += number
}
  return sum
}
sumOf()
sumOf(numbers: 42, 597, 12)
  • 函數(shù)嵌套使用
func returnFifteen() -> Int {
var y = 10
func add() {
    y += 5
}
// 方法內(nèi)部定義方法,聲明周期為方法
add()
return y
}
returnFifteen()
  • 函數(shù)當返回值
func makeIncrementer() -> ((Int) -> Int) {
    func addOne(number: Int) -> Int {
        return 1 + number
}
return addOne
}
var increment = makeIncrementer()
increment(7)
  • 函數(shù)當參數(shù)
 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) // 調(diào)用父類的初始化方法
    numberOfSides = 4 // 給父類的屬性賦值之前必須先調(diào)用父類的初始化方法
  }

  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)

運行結(jié)果

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

// 定義函數(shù) 如果多人合作的時候,可以使用這個讓別人更加了解你定義的屬性的含義
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 一樣使用 | 或操作呢?


結(jié)構(gòu)體

  • 定義
 struct Card {
// 定義結(jié)構(gòu)體
    var rank: Rank
    var suit: Suit
// 結(jié)構(gòu)體內(nèi)可以定義方法
func simpleDescription() -> String {
    return "The \\(rank.simpleDescription()) of \\(suit.simpleDescription())"
}
}
  • 使用
let threeOfSpades = Card(rank: .three, suit: .spades)
let threeOfSpadesDescription = threeOfSpades.simpleDescription()

協(xié)議

  • 定義
protocol ExampleProtocol {
     var simpleDescription: String { get }
     mutating func adjust()
}
  • 給類添加協(xié)議
class SimpleClass: ExampleProtocol {
 var simpleDescription: String = "A very simple class."
 var anotherProperty: Int = 69105
 func adjust() {
      simpleDescription += "  Now 100% adjusted."
 }
}
  • 給結(jié)構(gòu)體添加協(xié)議
struct SimpleStructure: ExampleProtocol {
     var simpleDescription: String = "A simple structure"
 mutating func adjust() {
      simpleDescription += " (adjusted)"
 }
}
  • 定義一個協(xié)議變量
let protocolValue: ExampleProtocol = a
print(protocolValue.simpleDescription)

擴展

例子:給Int 添加一個協(xié)議

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
}
  • 定義一個有異常處理能力的函數(shù)
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)
}

總結(jié)

Swift 的基本語法已經(jīng)了解完畢,但這只是些簡單的東西,如果Swift只是這些東西,那我們就沒有學習的必要了,Swift的靈活性,優(yōu)秀的設計模式,從上面的內(nèi)容體現(xiàn)不出來,我會在后面幾篇文章中,闡述它的高級用法!

我的博客即將搬運同步至騰訊云+社區(qū),邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=3i4a1yo68wsg0

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容