Swift 學習- 01 -- 基礎部分

來源:互聯網
上載者:User

標籤:gre   ack   list   fan   oda   完全   函數返回   orange   rem   

print("世界,你好")

 

var myVariable = 42

myVariable = 50

let myConstant = 42

 

let implicitinteger = 70

let  fffffff = 70.0

let exnfjenb: Double = 80

 

let changliang: Float = 4

var frewf: Double = 5

print(changliang)

 

 

let  label = "你哦好的"

let width = 94

let widthlabel = label + String(width)

 

let label2 = "1234565"

let heught: Int = 88

let all = String(heught) + label2

 

let apples = 3

let oranges = 5

 

let appleCount = "I have \(apples) apples"

 

let  fruitCount = "i have \(oranges) oranges"

print(fruitCount)

 

let fudina: Double = 402.0840000

let helloStr = "nihao de \(fudina) nihao"

print(helloStr)

 

 

var shoplist = ["apple","oranges","banage","blueanj"]

shoplist[1] = "bbbbbb"

shoplist .removeAll()

if shoplist.count > 2 {

    print(shoplist[1])

}else{

    print("數組為空白")

}

 

var dictionary = ["aaa":"AAA","bbb":"BBB"]

var emptyArray = [String]()

 

let individualScores = [12,23,34,45,56]

 

var teamScores = 0

for score in individualScores {

    if score > 20 {

        teamScores += 3

    }else{

        teamScores += 1

    }

}

 

print(teamScores)

 

// 在 if 語句中  條件必須是一個bool值,這意味著 判斷不會隱形的與 0 做對比

// 你可以一起使用 if 與 let 來處理值確實的情況,這些值將由可選值來代表

// 一個可選值是一個具體的值或者是 nil 以表示值缺失,在類型後面加一個問號來標記這個變數的值是可選的

 

 

var optionalName: String? = "John Appleseed"

optionalName = nil

var greeting = "Hello!"

if let name = optionalName {

    greeting = "Hello, \(name)"

}else{

    greeting = "Hello!,(杜露茜)"

}

 

print(greeting)

 

 

// 如果變數的可選值是nil,條件會判斷為false , 大括弧中的代碼會被跳過,如果不是nil ,會將值解包並賦給 let 後面的常量,這樣代碼中就可以使用這個值了

 

 

// 還有一種處理可選值的方法就是通過使用 ?? 操作符來提供一個預設值,如果可選值缺失的話,可以使用預設值來代替

 

let nickName: String? = "dingzhiije"

let fullName: String = "DingZhijie"

let myName = "my name is \(nickName ?? fullName)"

print(myName)

 

 

// switch 支援任意類型的資料以及各種比較操作--不僅僅是整數以及測試相等

 

let vegetrabel = "red pepper"

switch vegetrabel {

case "red pepper":

    print("red")

case "black":

    print("black")

default:

    print("no")

}

 

// swift 中 運行 switch 的時候 運行完匹配完的子句之後,程式會退出 switch 語句,並不會向下運行,所以不需要再每個子句之後寫 break;

 

 

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

var largestKey: String = ""

 

for (kind,numbers) in interestingNumbers {

    for number in numbers {

        if number > largest {

            largest = number;

            largestKey = kind

        }

    }

}

 

print(largest)

print(largestKey)

 

 

var num = 0

var addNum = 0

 

while num < 101 {

    addNum = addNum + num

    num += 1

}

print(addNum)

 

 

// 迴圈條件也可以在結尾迴圈一次,至少會迴圈一次

// repeat 迴圈語句

var m = 2

repeat { // 重複

    m = m * 2

} while m < 100

    print(m)

 

// 可以再迴圈中使用 ..< 來表示範圍

 

var total = 0

for i in 0 ..< 4 {

    total += 1

    print(i)

}

 

 

// a ..< b 的範圍是  大於等於 a , 但是小於 b

// a ... b 的範圍是  大於等於 a , 而且小於等於 b

// 這是因為 ..< 建立的範圍不包含上界, 但是 ... 建立的範圍包含上界

 

// 使用 func 來聲明一個函數,使用名字和參數來調用函數, 使用 -> 來指定函數的傳回值的類型

 

func green(person: String, day: String) -> String {

    return "hello \(person), today is \(day)"

}

 

print(green(person: "houdecheng", day: "2017-5-5"))

 

 

func eat(person: String, eatWhat: String) -> String {

    return "hello, \(person), my today wat\(eatWhat)"

}

 

print(eat(person: "houdehcneg", eatWhat: "danchaofan"))

 

 

// 預設情況下,函數使用它們的參數名稱作為它們參數的標籤, 在參數名稱前面可以自訂參數標籤, 或者使用 _ 表示不使用參數標籤

 

func ceshi( _ person: String,on day: String) -> String{

    return "hello, \(person), today is \(day)"

}

 

print(ceshi("houdehceg", on: "2017-5-5"))

 

 

// 使用元組讓函數返回多個值,元組的元素可以用名稱或者數字來表示

 

func yuanzuceshi(scores: [Int]) -> (min: Int,max: Int, sum: String){

    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;

    }

    let sumStr: String = String(sum)

    

    

    return (min,max,sumStr)

}

 

print(yuanzuceshi(scores: [15,54,45,54,78,15,6,98]))

 

// 函數可以帶有可變個數的參數,這些參數在函數內表現為數組的形式

 

func kebiancanshu(numbers: Int...) -> Double {

    var sum = 0

    for i in numbers {

        sum += i

    }

    

    let pingjunzhi: Double = Double(sum)/Double(numbers.count)

    

    

    

    return pingjunzhi

}

 

print(kebiancanshu(numbers: 4,3,5,6))

 

// 函數可以嵌套 , 被嵌套的函數可以訪問外側函數的的變數 你可以使用嵌套函數來重構一個太長或者太複雜的函數

 

func returnFifteen() -> Int{

    var y = 10

    func add(){

        y += 5

    }

    

    add()

    return y

}

 

print(returnFifteen())

 

// 函數是第一等類型  這意味著函數可以作為另一個函數的傳回值

 

func addOne(number: Int,str: String) -> Int{

    return Int(str)! + number

}

 

func makeIncrmenter() -> ((Int,String) -> Int) {

    return addOne(number:str:)

}

 

var increment = makeIncrmenter()

print(increment(88,"44"))

 

 

// 函數也可以當做參數傳入另一個函數

 

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

}

 

let numbers = [20,19,7,12]

let dictionary2: Dictionary = ["1":45,"2":43]

 

 

print(hasAnyMatches(list: numbers, condition: lessThanTen(number:)))

 

 

// 函數實際上是一種特殊的閉包, 他是一段之後能調用的代碼.閉包中的代碼能訪問閉包所建立範圍中能得到的變數和函數,即使閉包是在一個不同的範圍被執行的 - 可以使用 {} 來建立一個匿名閉包, 使用 in 將參數和傳回值類型與閉包函數體進行分離

 

print(numbers.map { (number: Int) -> Int in

    let result = 3 * number

    return result

})

 

// 有很多種建立更簡潔的閉包的方法,如果一個閉包的類型已知,比如作為一個回呼函數,你可以忽略參數的類型和傳回值,單個語句閉包會把它語句的值當做傳回值返回

//let mappedNumbers = numbers.map({ number in 3 * number })

//print(mappedNumbers)

 

let mappendNumbers = numbers.map { (number: Int) -> Int in

    let result = 3 * number

    return result

}

print(mappendNumbers)

 

// 可以通過參數的位置而不是參數的名稱來引用參數 -- 這個方法在非常短的閉包中非常有用,當一個閉包作為最後一個參數傳給函數的時候,他可以直接在括弧後面,當一個閉包是傳給函數的唯一參數,你可以完全忽略括弧

 

let sortedNumbers = numbers.sorted { (a, b) -> Bool in

    a > b

}

 

print(sortedNumbers)

 

 

// 字典的排序

let dicSorted = dictionary2.sorted { (a, b) -> Bool in

    a.value > b.value

}

 

print(dicSorted)

 

 

// 對象和類

// 使用 class 和類名建立一個類. 類中屬性的聲明和變數,變數聲明一樣,唯一的區別就是他們的上下文是類,同樣,方法核函式宣告也一樣

 

class Shape {

    var numberOfSides = 0

    func simpleDescription() -> String {

        return "A shape with \(numberOfSides) sides."

    }

}

 

// 要建立一個類的執行個體,在類名後面加上括弧,使用點文法來訪問執行個體的屬性和方法

var shape = Shape()

shape.numberOfSides = 7

print(shape.simpleDescription())

 

 

 

class MyDay{

    let day = "2017年 5月 5號"

    func prienDay(day: String) -> String {

        return "今天是 \(day)"

    }

}

 

 

var mydays = MyDay.init()

print(mydays.prienDay(day: mydays.day))

 

// 這個版本的 Shape 缺少了一些重要的東西,一個建構函式來初始化執行個體,使用 init 來建立一個構造器

class NamedShape{

    var numberOfSides: Int = 0

    var name: String

    init(name: String) {

        self.name = name

    }

    

    func simpleDecription() -> String {

        return "A shape with \(numberOfSides) \(name) sides"

    }

}

 

var nameShpe = NamedShape.init(name: "houdehcneg")

print(nameShpe.simpleDecription())

 

 

// 注意 self 被用來區別執行個體變數,當你建立的時候,像傳入函數參數一樣給類擦混入構造器的參數,每個屬性都需要賦值 -- 無論是通過聲明 (例如 numberOfSides) 還是通過構造器 (例如 name)

 

// 如果你需要在刪除對象之前進行一些清理工作, 使用 deinit 建立一個拆構函數

 

// 子類的定義方法是在他們的類名後面加上父類的名字,用冒號分割,建立類的時候並不需要一個標準的跟類,所以你可以忽略父類

 

// 子類如果需要重寫父類的方法,需要用 override 標記 -- 如果沒有添加 override  就去重寫父類的方法編輯器會報錯,編輯器同樣會檢測 override 標記的方法是否確實在父類中

 

 

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 simpleDecription() -> String {

        return "A squre with side of length \(sideLength) \(numberOfSides)"

    }

    

}

 

let test = Square.init(sideLength: 5.2, name: "my test squre")

print(test.area())

print(test.simpleDecription())

 

class Circle: NamedShape{

    var banjing:Double

    

    init(banjing: Double,name: String) {

        self.banjing = banjing

        super.init(name: name)

        

    }

    

    func area() -> Double {

        return self.banjing

    }

    

    override func simpleDecription() -> String {

        return "\(banjing),\(numberOfSides),\(name)"

    }

}

 

var circle = Circle.init(banjing: 2.0, name: "dinngzhijie")

 

print(circle.area())

print(circle.simpleDecription())

Swift 學習- 01 -- 基礎部分

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.