Swift3.0 - 真的很簡單

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,237評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,957評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,248評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,356評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,081評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,485評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,534評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,720評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,263評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,025評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,204評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,787評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,461評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,874評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,105評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,945評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,205評論 2 375

推薦閱讀更多精彩內容