亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

swift上手

2019-11-14 20:09:53
字體:
來源:轉載
供稿:網友

學習swift的筆記,偶爾會更新一下

變量與常量

變量定義使用var,常量使用let,類型安全,有自動類型推導,注意賦值的=號兩邊必須有空格。
變量和常量名是可以幾乎所有字符,這些都非常像javascript。中文編程一下牛逼了。

var a = 123 //a為Intlet b = "helo" //b為Stringvar 貓叫 = "喵"

數字

  • 十進制
  • 二進制 0b101
  • 八進制 0o5
  • 十六進制 0x5

比較長的數字間可以加上_用來提高程序的可讀性,比如0_0其實就是0,_線不能加在開頭

布爾類型

truefalse,流程控制if的時候,判斷語句返回必須是一個Bool值,比如:

let i = 1if i {   //編譯報錯}

這樣就可以通過

if i == 1 {}

它不像js里會有自動類型轉換

類型別名

給現在的類型添加別名,同樣可以提高程序的可讀性,如

typealias 音頻采樣 = UInt16

可以在別的地方使用

var  已發現的最大振幅 = 音頻采樣.min

元組

它可以是一組值,這些值不必是相同的類型,例如,定義我自己:

var jserme = ("183cm", 26, "76kg")

可以像數組一樣訪問

PRintln(jserme.0) //返回183cm

元組還原為獨立的變量或者常量

let jserme = ("183cm",26,"76kg")let (身高, 年齡, 體重) = jsermeprintln("身高是 /(身高)")

也可以給每個值命名(這就像在JS里把數組搞成了對象了。。。)

let jserme = (身高:"183cm",年齡:26,體重:"76kg")println("身高是 /(jserme.身高)")

字符串

字符串字面量只能用""來定義,String本質上是Character的有序集合。

for char in  "一言既出"{    println(char)}/*一言既出*/

字面量與判斷是否為空

var 字符串 = "我是字符串"var 空字符串 = ""if 空字符串.isEmpty {	println("這是一個空的字符串")}if 空字符串 == "" {    println("這是一個空的字符串")}

字符串實例有兩個方法hasprefixhasSuffix,如:

var 成語數組 = [    "一言既出",    "一觸即發",    "一呼百應",    "一槌定音",    "一無所有",    "一生一世",    "一見鐘情"]var count = 0for 成語 in 成語數組 {    if(成語.hasPrefix("一")){        count++    }}println(count) //輸出7

與js一樣,string也是傳值引用,下面的兩個變量的修改不會影響到彼此

var 一串 = "我是字符串一"var 二串 = 一串二串 = "我是字符串二"println("字符串一:/(一串), 字符串二:/(二串)")

區間運算符

閉區間使用a...b,從a到b,包含a與b,半區間a..b,從a到b,不包含b,例如:

var 成語數組 = [    "一言既出",    "一觸即發",    "一呼百應"]for i in 0..成語數組.count {    println("第/(i)個成語是:/(成語數組[i])")}//這里如何使用...會報錯,因為成語數組[3]是沒有值的

兩種集合,array 和 dictionaries

相對于js對數組和對象成員松散的要求,swift要求數組和dictionaries里成員類型必須一致

var 購物清單: String[] = ["雞蛋", "牛奶"]//也可以是下面的這樣//var 購物清單 = ["雞蛋", "牛奶"]

數組的修改可以使用append方法或者+=

var 購物清單 = ["雞蛋", "牛奶"]購物清單.append("蘋果")購物清單 += "草莓"println("/(購物清單)") //[雞蛋, 牛奶, 蘋果, 草莓]

數組的獲取,可以通過索引,也可以通過區間運算符

var 購物清單 = ["雞蛋", "牛奶"]println("/(購物清單[0])") //雞蛋println("/(購物清單[0..1])") //[雞蛋]println("/(購物清單[0...1])") //[雞蛋, 牛奶]println("/(購物清單[0...2])") //[雞蛋, 牛奶, ]

dictionaries的定義

var airports: Dictionary<String, String> = ["TYO": "Tokyo", "DUB": "Dublin"]//也可以簡化為//var airports = ["TYO": "Tokyo", "DUB": "Dublin"]

它的修改與讀取使用[],而不能使用.

airports["BJ"] = "Beijin"

控制語句

如前面的幾個例子所示,控制語句的條件不像js有小括號

for var index = 0; index < 3; index++ {    println("index is /(index)")}//index is 0//index is 1//index is 2

函數

函數的聲明與調用:

func sayHello(personName: String) -> String {    let greeting = "Hello, " + personName + "!"    return greeting}println(sayHello("jserme"))

無返回的函數,其實質是返回一個Void,它等同于一個空的元組()

多返回值的函數與默認參數:

func info(Word:String = "aha") -> (length:Int, containA:Bool){    var containA = false    for char in word {        if( char == "a") {            containA = true            break        }    }        return (word.utf16count, containA)}println(info(word: "波波")) //(2, false)println(info()) //(3, true)

便于閱讀的外部參數名,在參數定義之前,與參數定義以空格隔開,如下面的多個參數

func join(string s1: String, toString s2: String, withJoiner joiner: String)    -> String {    return s1 + joiner + s2}//調用的時候join(string: "hello", toString: "world", withJoiner: ", ")// returns "hello, world"

參數名與外部參數名一致,可以給參數名加#標識:

func containsCharacter(#string: String, #characterToFind: Character) -> Bool {    for character in string {        if character == characterToFind {            return true        }    }    return false}let containsAVee = containsCharacter(string: "aardvark", characterToFind: "v")// containsAVee equals true, because "aardvark" contains a "v"

函數的參數是常量,不可以修改,如果在函數內修改,變量定義前加var

func alignRight(var string: String, count: Int, pad: Character) -> String {    let amountToPad = count - countElements(string)    for _ in 1...amountToPad {        string = pad + string    }    return string}let originalString = "hello"let paddedString = alignRight(originalString, 10, "-")// paddedString is equal to "-----hello"// originalString is still equal to "hello"

如果想在函數內修改傳入的參數,可以使用inout關鍵字來標識,傳入的參數需要前綴&,這內部實現應該是指針。

func swapTwoInts(inout a: Int, inout b: Int) {    let temporaryA = a    a = b    b = temporaryA}var someInt = 3var anotherInt = 107swapTwoInts(&someInt, &anotherInt)println("someInt is now /(someInt), and anotherInt is now /(anotherInt)")// prints "someInt is now 107, and anotherInt is now 3"

函數類型,可以像js一樣使用函數作為參數及返回值

func addTwoInts(a: Int, b: Int) -> Int {    return a + b} //函數類型為 (Int, Int) -> Intfunc multiplyTwoInts(a: Int, b: Int) -> Int {    return a * b}//函數類型為 (Int, Int) -> Int//接收名為mathFunction的函數類型func printMathResult(mathFunction: (Int, Int) -> Int, a: Int, b: Int) {    println("Result: /(mathFunction(a, b))")}printMathResult(addTwoInts, 3, 5)// prints "Result: 8"//返回函數類型func stepForward(input: Int) -> Int {    return input + 1}func stepBackward(input: Int) -> Int {    return input - 1}func chooseStepFunction(backwards: Bool) -> (Int) -> Int {    return backwards ? stepBackward : stepForward}var currentValue = 3let moveNearerToZero = chooseStepFunction(currentValue > 0)// moveNearerToZero now refers to the stepBackward() function

閉包

函數與它包含的上下文的變量在一起稱為閉包。如sort函數:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]func backwards(s1: String, s2: String) -> Bool {    return s1 > s2}var reversed = sort(names, backwards)println(reversed)// reversed is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]s

使用閉包可以表示為:

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]var reversed = sort(names, {(s1:String, s2:String) -> Bool in    return s1 > s2})println(reversed)// reversed is equal to ["Ewa", "Daniella", "Chris", "Barry", "Alex"]

也可以簡化為

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]var reversed = sort(names, { s1, s2 in s1 > s2 } )println(reversed)

枚舉

通過下面的語法聲明

enum Barcode {	case UPCA(Int, Int, Int) = (1,2,3)    case QRCode(String) = "hello"}

類與結構體

推薦使用首字母大寫來命名

struct Resolution {    var width = 0    var heigth = 0}class VideoMode {    var resolution = Resolution()    var interlaced = false    var frameRate = 0.0    var name: String?}

生成實例:

let someResolution = Resolution()let someVideoMode = VideoMode()

屬性訪問與修改,使用.語法:

println("The width of someVideoMode is /(someVideoMode.resolution.width)")someVideoMode.resolution.width = 12880println("The width of someVideoMode is now /(someVideoMode.resolution.width)")

結構體有自動成員初始化器,類實例沒有:

let vga = resolution(width:640, heigth: 480)

結構體與枚舉都是值類型,類是引用類型

對于引用了同一個實例的值,可以使用===!==來進行判斷

延遲屬性,@lazy,設置在調用的時候才初始化特定的屬性

class DataImporter {    /*    DataImporter 是一個將外部文件中的數據導入的類。    這個類的初始化會消耗不少時間。    */    var fileName = "data.txt"    // 這是提供數據導入功能}class DataManager {    @lazy var importer = DataImporter()    var data = String[]()    // 這是提供數據管理功能}let manager = DataManager()manager.data += "Some data"manager.data += "Some more data"// DataImporter 實例的 importer 屬性還沒有被創建

類、結構體、枚舉都可以通過設置settergetter

struct AlternativeRect {    var origin = Point()    var size = Size()    var center: Point {    get {        let centerX = origin.x + (size.width / 2)        let centerY = origin.y + (size.height / 2)        return Point(x: centerX, y: centerY)    }    set { //這里setter 沒有定義表示新值的參數名,則可以使用默認名稱newValue        origin.x = newValue.x - (size.width / 2)        origin.y = newValue.y - (size.height / 2)    }    }}

只讀屬性去掉getset

屬性監視可以使用willsetdidset來處理

類型屬性有點像靜態變量,以static關鍵字聲明

struct SomeStructure {    static var storedTypeProperty = "Some value."    static var computedTypeProperty: Int {    // 這里返回一個 Int 值    }}

下標

類、結構體、枚舉都可以有下標,它有像給它們增加了一個快捷方式,如下:

struct TimesTable {    let multiplier: Int    subscript(index: Int) -> Int {        return multiplier * index    }}let threeTimesTable = TimesTable(multiplier: 3)println("3的6倍是/(threeTimesTable[6])")// 輸出 "3的6倍是18"

繼承

定義一個類

class Vehicle {    var numberOfWheels: Int    var maxPassengers: Int    func description() -> String {        return "/(numberOfWheels) wheels; up to /(maxPassengers) passengers"    }    init() {        numberOfWheels = 0        maxPassengers = 1    }}

繼承類

class Bicycle: Vehicle {    init() {        super.init()        numberOfWheels = 2    }}

重寫屬性與方法

class Car: Vehicle {    var speed: Double = 0.0    override var speed: Double  {    get {        return super.speed    }    set {        super.speed = min(newValue, 40.0)    }    }    init() {        super.init()        maxPassengers = 5        numberOfWheels = 4    }    override func description() -> String {        return super.description() + "; "            + "traveling at /(speed) mph"    }}

防止重寫,在方法與屬性前加關鍵字@final,編譯時會出錯

構造函數

聲明里可以寫多個init,這有點像重載

struct Celsius {    var temperatureInCelsius: Double = 0.0    init(fromFahrenheit fahrenheit: Double) {        temperatureInCelsius = (fahrenheit - 32.0) / 1.8    }    init(fromKelvin kelvin: Double) {        temperatureInCelsius = kelvin - 273.15    }}let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)// boilingPointOfWater.temperatureInCelsius 是 100.0let freezingPointOfWater = Celsius(fromKelvin: 273.15)// freezingPointOfWater.temperatureInCelsius 是 0.0”

類的析構

有些地方叫反初始化,很別扭的名字哦

class Player {    var coinsInPurse: Int    init(coins: Int) {        coinsInPurse = Bank.vendCoins(coins)    }        func winCoins(coins: Int) {        coinsInPurse += Bank.vendCoins(coins)    }        deinit {        Bank.receiveCoins(coinsInPurse)    }}var player = Player(coins:200)player = nil  //調用deinit方法

擴展

對于類、結構體、枚舉,可以擴展它們的一切

class Player{	var age:Int}extension Player{	func repetitions(task: () -> ()) {        for i in 0..self {            task()        }    }}

協議

其實就是接口描述

 protocol SomeProtocol {     var mustBeSettable: Int { get set }     var doesNotNeedToBeSettable: Int { get }     func someTypeMethod() }

協議繼承

 protocol InheritingProtocol: SomeProtocol, AnotherProtocol {      // protocol definition goes here }

泛型

這個函數的泛型版本使用了節點類型命名(通常此情況下用字母T來表示)來代替實際類型名(如Int、String或Double)。節點類型名并不是表示T必須是任何類型,但是其規定a和b必須是同一類型的T,而不管T表示任何類型。只有swapTwoValues函數在每次調用時所傳入的實際類型決定了T所代表的類型。

 func swapTwoValues<T>(inout a: T, inout b: T) {        let temporaryA = a        a = b        b = temporaryA    }

運算符重載

這里演示重載+號運算符

struct Vector2D {    var x = 0.0, y = 0.0}@infix func + (left: Vector2D, right: Vector2D) -> Vector2D {    return Vector2D(x: left.x + right.x, y: left.y + right.y)}
  • 前置運算符 @prefix
  • 后置運算符 @postfix
  • 組合賦值運算符 @assignment
  • 比較運算符 @infix
@prefix @assignment func ++ (inout vector: Vector2D) -> Vector2D {    vector += Vector2D(x: 1.0, y: 1.0)    return vector}

自定義運算符

個性的運算符只能使用這些字符 / = - + * % < >!& | ^。~

Operator prefix +++ {}@prefix @assignment func +++ (inout vector: Vector2D) -> Vector2D {    vector += vector    return vector}

結合性(associativity)的值默認為none,可用left,right,none,優先級(precedence)默認為100。

operator infix +- { associativity left precedence 140 }func +- (left: Vector2D, right: Vector2D) -> Vector2D {    return Vector2D(x: left.x + right.x, y: left.y - right.y)}let firstVector = Vector2D(x: 1.0, y: 2.0)let secondVector = Vector2D(x: 3.0, y: 4.0)let plusMinusVector = firstVector +- secondVector// plusMinusVector 此時的值為 (4.0, -2.0)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文有码在线视频| 国产91ⅴ在线精品免费观看| 日本中文字幕不卡免费| 伊人激情综合网| 5566日本婷婷色中文字幕97| 91网站免费观看| 久久综合88中文色鬼| 日韩中文在线中文网在线观看| 91精品国产综合久久香蕉| 国产婷婷色综合av蜜臀av| 中文字幕亚洲国产| 亚洲精品日韩久久久| 成人网址在线观看| 亚洲男人天堂网| 欧美日韩在线免费观看| 亚洲加勒比久久88色综合| 亚洲免费视频一区二区| 亚洲天堂av图片| 国产91色在线播放| 欧美孕妇毛茸茸xxxx| 亚洲国产成人精品一区二区| 久久精品视频导航| 国产亚洲精品久久久优势| 81精品国产乱码久久久久久| 久久频这里精品99香蕉| 国产一区二区三区三区在线观看| 国产91精品在线播放| 日韩精品欧美国产精品忘忧草| 欧美高清videos高潮hd| 97免费视频在线| 久久久影视精品| 欧美尤物巨大精品爽| 午夜精品蜜臀一区二区三区免费| 韩国19禁主播vip福利视频| 国产精品高潮呻吟视频| 日韩欧美一区二区三区久久| 在线日韩精品视频| 精品国产欧美一区二区五十路| 日日狠狠久久偷偷四色综合免费| 日韩美女视频免费在线观看| 亚洲黄色有码视频| 2019中文字幕全在线观看| 国产精品中文在线| 亚洲午夜av久久乱码| 国产欧美日韩亚洲精品| 91精品国产91久久久久久久久| 在线成人激情视频| 日韩在线观看av| 狠狠色噜噜狠狠狠狠97| 精品国偷自产在线视频| 日韩精品在线私人| 中文字幕亚洲综合| 亚洲精品乱码久久久久久按摩观| 国产成人精品综合| 91在线观看免费高清完整版在线观看| 欧美激情精品久久久久久免费印度| 亚洲成人在线网| 青草青草久热精品视频在线观看| 欧美激情国产日韩精品一区18| 一本色道久久综合狠狠躁篇怎么玩| 久热国产精品视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品国产三级国产aⅴ9色| 日韩av电影中文字幕| 久久精品在线播放| 亚洲性日韩精品一区二区| 亚洲精品乱码久久久久久按摩观| 亚洲wwwav| 91精品视频一区| 亚洲国产精品成人av| 日本精品一区二区三区在线| 精品国内产的精品视频在线观看| 亚洲色图第三页| 久久久亚洲影院| 国产97免费视| 亚洲视频一区二区| 丝袜亚洲另类欧美重口| 国产精品美女无圣光视频| 欧美激情久久久久久| 一区二区欧美亚洲| 国产精品免费久久久| 亚洲区在线播放| 成人免费视频在线观看超级碰| 91九色国产社区在线观看| 久久6免费高清热精品| 欧美精品在线免费播放| 欧美成人一区在线| 欧美高清电影在线看| 亚洲精品综合精品自拍| 国产精品羞羞答答| 深夜福利亚洲导航| 精品视频—区二区三区免费| 美女视频黄免费的亚洲男人天堂| 色综合视频网站| 成人激情综合网| 日韩av资源在线播放| 日本午夜在线亚洲.国产| 亚洲另类xxxx| 亚洲天堂男人的天堂| 欧美激情在线播放| 国产精品美女免费视频| 九九视频这里只有精品| 中文字幕日韩欧美| 日韩小视频在线观看| 国产成人亚洲综合青青| 97超级碰在线看视频免费在线看| 清纯唯美亚洲激情| 久久久999国产精品| 亚洲欧美日韩精品| 日韩精品亚洲元码| 亚洲一区www| 性欧美视频videos6一9| 欧美视频中文字幕在线| 欧美疯狂xxxx大交乱88av| 午夜欧美不卡精品aaaaa| 中文字幕欧美专区| 最新国产精品拍自在线播放| 国产精品一区二区性色av| 亚洲精品美女久久久久| 久久精品亚洲一区| 成人免费视频a| 精品久久久久久电影| 亚洲国产精品热久久| 日韩日本欧美亚洲| 91亚洲精品久久久久久久久久久久| 大量国产精品视频| 在线观看国产精品淫| 亚洲国产精品国自产拍av秋霞| 亚洲网站在线观看| 日韩精品福利网站| 久久久久999| 亚洲激情在线观看视频免费| 欧美成aaa人片在线观看蜜臀| 日韩av不卡电影| 午夜精品视频在线| 成人免费观看49www在线观看| 国产精品福利网站| 久久久精品国产网站| 欧美日韩中文字幕综合视频| 2019中文字幕免费视频| 日韩在线观看成人| 欧美极品在线视频| 91精品国产91久久久久久久久| 精品国模在线视频| 亚洲aⅴ日韩av电影在线观看| 久久琪琪电影院| 亚洲一区二区中文字幕| 亚洲人成电影在线| 亚洲精品免费一区二区三区| 日韩精品免费在线播放| 国产精品久久一| 最近2019好看的中文字幕免费| 91av免费观看91av精品在线| 欧美男插女视频| 成人高h视频在线| 热久久免费国产视频| 久久躁日日躁aaaaxxxx| 亚洲美女在线看| 国产一区二区免费| 国产日韩亚洲欧美| 欧美激情性做爰免费视频| 日韩在线视频观看正片免费网站| 这里只有精品丝袜| 日韩免费观看视频|