Swift基礎語法

import Foundation


//1.字符串和字符

var sampleStrd:String

var keyNote = "someNote"

if keyNote.isEmpty{

    println(keyNote)

}

let gameName = "2048"

println("hello my program name is \(gameName)")


var iRadius = 6

println("The circle's area is \(Double(iRadius)*3.1415926)")


//Swift中便是字符使用characters類型

var doller:Character = "$"

//統計字符串中的字符個數要使用countElements函數

let LogTitle = "Swift is a new object-oriented programming language fir iOS and OS X development."


println("LogTitle has \(countElements(LogTitle)) characters")


//2.字符串和字符的常用操作

//+連接操作符

let rightName = "Ney"

let leftName = "mar"

var hisName = leftName + rightName

println(hisName)

//== 判斷字符串是否相等  != 是否不等

let str1 = "qwer"

let str2 = "qwer"

if str1 == str2{

    println("These two strings are full equal")

}

//String類型的hasPrefix/hasSuffix檢查字符串是否有特定的前綴/後綴

var ExceptionLogs = [

    "Warning: Login In System with no password Check By DB",

    "Warning: View customer list without DB",

    "Error: You have no Jurisdiction",

    "Warning: A Operate is no effect",

    "Error: Illicit close program"]

var warningCount = 0

var errorCount = 0

    //for in 遍歷字符串日誌數組

for atitle in ExceptionLogs{

    if atitle.hasPrefix("Warning"){

        warningCount++

    }

    if atitle.hasPrefix("Error"){

        errorCount++

    }

}

println("Warning have \(warningCount) and error have \(errorCount).")

//uppercaseString lowercaseString 字符串大小寫

let s1 = "ABCDE"

let s2 = "abcde"

var s3 = s1.lowercaseString

if s3 == s2 {

    println("The String is equal ")

}


//3.可選 optional

//聲明

var roundValue: Int?

println("The round value is \(roundValue?.description)")

//真正顯式的聲明

var optionalValue:Optional<Int> = 1

//可選綁定

if var MaxValue = optionalValue{

    MaxValue += 1

    println("The convert Value is \(MaxValue)")

}

    //若確定某個可選類型的變量肯定包含值的時候,可以使用名稱緊跟!的方式強制獲取其中的值,而忽略判斷的步驟,但是如果沒有值,使用強制解析可選會異常

    var opValue: Int?

    //println("\(opValue!)")//這樣強制解析就會崩潰

//可選運算符 ?? a??b:運算符前的可選值anil時返回操作數b的值,a不爲nil時返回a的值

var succedCreateClass:Int?

var feedBack = 1

var returnValue = succedCreateClass ?? feedBack

println(returnValue)




//4.元組

//匿名元組

let (appType,appName)=("game","2048")

//匿名元組可以通過其元素名來訪問

println("I have \(appType),it's names \(appName)")

//標準的元組

let myProject = (oneElement:"game",twoElement:"2048")

println("Project Type is \(myProject.oneElement)")

println("Project name is \(myProject.twoElement)")


//5.類型別名

//Int8取一個別名

typealias ShortInteger = Int8

//這個時候var myInt:ShortInteger等價於var myInt:Int8

var myInt: ShortInteger


//6.斷言

//Debug階段.使用觸發異常並提示錯誤的方式,可以儘量有效地消滅有可能出現的bug

//Swift中可以調用全局的assert函數來增加一個斷言,這裏全局的意思是你可以將斷言寫在程序的任何一個地方

var useDate = -1

assert(useDate <= 0, "數據大於0,錯誤") //<=0,符合條件繼續運行;>0,提出異常:數據大於0 錯誤


//7.運算符

//Swift%爲求餘運算,符號會和第一個操作數一樣.並且可以對浮點數進行求餘

var tmp1 = -12 % 5

println(tmp1.description)//輸出-2

var tmp2 = 13 % -6

println(String(tmp2))//輸出1

var tmp3 = 11.5 % 5

println(tmp3)//輸出1.5

var tmpRandom = arc4random() % 100

println(tmpRandom)//輸出1~100的隨機數

//=== !== 恆等 不恆等 判斷兩個對象是否引用同一個類實例

//區間運算符 a...b 閉區間 a..<b 半閉半開區間  

for iCount in 512...1024{

    if (iCount % 2) == 0{

        //println("the cow is \(iCount)")

    }

}

var fruts = ["apple","orange","belaner"]

let icount = fruts.count

for i in 0..<icount{

    println("\(i+1)個水果是\(fruts[i])")

}

//8.高級運算符

//按位與 按位或 按位異或

//溢出運算符  &+  &-  &*  &/  &%

var a = 1

//var b = a/0  當使用的除數或求餘數爲0,是錯誤的

var d = a &/ 0

var e = a &% 0//使用溢出運算符來避免錯誤

println(d)

println(e)

//運算符重載

//舉例

struct CenterPointer{

    var x = 0, y = 0

}

 //重載一箇中置 + 運算符 計算了兩個點相加

func + (left:CenterPointer, right:CenterPointer) -> CenterPointer{

    return CenterPointer(x: left.x + right.x, y: left.y + right.y)

}

let zPointer = CenterPointer(x:2, y:3)

let yPointer = CenterPointer(x:5, y:3)

let xPointer = zPointer + yPointer

println(xPointer.x,xPointer.y)

//重載一個前置或後置運算符,就需要在func 錢加上prefix postfix屬性

//CenterPointer實現座標取反運算

prefix func - (fPointer:CenterPointer) -> CenterPointer{

    return CenterPointer(x: -fPointer.x, y: -fPointer.y)

}

let qPointer = -zPointer

println(qPointer.x,qPointer.y)

//組合賦值運算符

//把運算符的左參數設置成inout類型,從而使運算符函數體內部可以直接修改它的值

//實現結構體的加法賦值運算符

func += (inout left:CenterPointer, right:CenterPointer){

    left = left + right

    println(left.x)

}

//qPointer += qPointer //有問題


//9.自定義運算符

//自定義一個運算符通常需要先聲明再實現其功能,聲明需要使用operator關鍵字

//先定義運算符

prefix operator +++ {}

//"+++"是實現自加的基礎上再加1

prefix func +++ (inout Pointer:CenterPointer) -> CenterPointer{

    Pointer += Pointer

    Pointer += CenterPointer(x:1,y:1)

    return Pointer

}

var tPointer = CenterPointer(x: 1, y: 3)

var ePointer = +++tPointer

println(ePointer.x.description,ePointer.y.description)//(3,7)

//指定運算符的優先級(precedence :默認值爲100)和結合性(associativity:left right none)

infix operator +- {associativity left precedence 140}

func +- (left:CenterPointer, right:CenterPointer) -> CenterPointer{

    return CenterPointer(x: left.x + right.x, y: left.y - right.y)

}

let Pointer1 = CenterPointer(x: 2, y: 5)

let Pointer2 = CenterPointer(x: 3, y: 6)

let Pointer3 = Pointer1 +- Pointer2

println(Pointer3.x,Pointer3.y)//(5,-1)


//10.數組

var emptyArray = [String]() //創建數組標準格式

var ExceptionTypes = ["none","warning","error"] //省略類型的數組聲明

ExceptionTypes[0] = "it's safy" //訪問並修改其中的元素

var Arrayname = Array<String>() //最正式的聲明格式

//聲明一個空數組

var BrazilTeamMembers = [String]()

BrazilTeamMembers.append("six")//向數組中添加一個元素

BrazilTeamMembers.insert("one", atIndex: 0)//指定位置插入數組元素

//BrazilTeamMembers += "seven" //通過+=添加元素

BrazilTeamMembers.isEmpty //是否爲空

BrazilTeamMembers[1] = "two" //爲下表爲1的元素賦值爲two

BrazilTeamMembers.count //數組元素的個數

BrazilTeamMembers.removeAtIndex(1)//刪除下標爲2的元素

BrazilTeamMembers.removeLast()//刪除最後一個元素

BrazilTeamMembers.removeAll(keepCapacity: true)//刪除所有元素,但保留大小

var addStringArr = ExceptionTypes + BrazilTeamMembers // + 來組和兩個相同類型的數組

var multArr = Array<Array<Int>>() //標準聲明一個二維數組


//11.字典

var myDictionaries = [

    "apptype":"2dgame",

    "name":2048,

    "company":"Swift In Action"

]

myDictionaries["name"] = "2048 Update"//修改

myDictionaries.updateValue(4096, forKey: "name")//修改

myDictionaries.removeValueForKey("company")//刪除

myDictionaries.keys//字典的key集合

myDictionaries.values //value集合

println(myDictionaries)


//12.結構體

struct BookInfo{

    var ID:Int = 0

    var Name:String = "Default"

    var Author:String = "Default"

    var RootType:String = "Default"

    var SubtType:String = "Default"

    var Position:String = "0-0-0-0"

}

//調用默認構造器創建一個結構體實例

var ProgramGuide:BookInfo

var BeautyMath = BookInfo(ID: 0021, Name: "The Beauty Math", Author: "JunMu", RootType: "It", SubtType: "Math", Position: "E6-3-7-687")


//13.枚舉

//定義一個枚舉最好 大寫枚舉首字母

enum PointRect{

    case top

    case bottom

    case left

    case right

}


//14 if  swith

//switch中每個case塊必須包含至少一條語句;switch語句不會同時匹配大寫字母和小寫字母

//switch語句也支持值綁定

var anotherPoint = (2,2)

switch anotherPoint{

case (var x, 0): //(_,0)

    x--

    println("\(x) on the x-axis")

case (0, var y): //(0,_)

    y++

    println("\(y) on the y-axis")

case let (x,y)where x == y: //x等於y時執行此case塊中的語句

    println("(\(x),\(y)) is on the line x == y")

case let (x,y): //(_,_)

    println("point at (\(x),\(y))")

}

//for

for chare in "Hello World!"{

    println(chare)

}


//15控制轉向語句

//continue 通知一個循環體立刻停止本次循環,直接回到循環條件判斷,重新開始下一次循環

let useInput = "To write the code for class, you must provide three chunks or sections of code."

var OutputCount = 0

for chare in useInput{

    switch chare{

        case "a","e","i","o","u":

        //跳出本次循環,直接回到條件判斷語句處

        continue

    default:

        OutputCount++

    }

}

println(OutputCount)//55個非元音字符

//break

for chare in useInput{

    switch chare{

        case "a","e","i","o","u":

        //跳出整個循環體

        break

    default:

        OutputCount++

    }

}

println(OutputCount)//110

//fallthrough 使switchcase代碼繼續連接到下一個case執行

//標籤語句 Labeled Statements 顯示的指出需要跳出的是哪一層循環或switch結構

//爲了實現這個目的,使用標籤來爲循環體或者switch代碼塊打上標記,當需要使用break或者continue,帶上這個標籤就可以控制該標籤代表對象的中斷或者跳出

var iarea = 100

var compeCount = 0

var primeCount = 0

var i = 2

var j = 2

var NumType = ""

var bFinded = true

mainLoop : while i < 100 {

    bFinded = false

    NumType = ""

    inLoop : while j < i-1 {

        if i%j == 0{

            NumType = "compe"

            bFinded = true

            break inLoop

        }

        j++

    }

    if !bFinded {

        NumType = "prime"

    }

    switch NumType{

        case "compe":compeCount++

        case "prime":primeCount++

    default:break mainLoop

    }

    i++

}

println("1-\(iarea)的合數有\(compeCount).")

println("1-\(iarea)的素數有\(primeCount).")


//16.函數

func isSell (commodityName:String) -> Bool{

    return true

}

if isSell("33"){

    

}

//在實際參數前加上外部形參標籤,起到了解釋作用

func addString(s1:String, sSex s2:String, sAge s3:String) -> String{

    return "Name is " + s1 + " sex is " + s2 + " age is " + s3

}

println(addString("lily", sSex: "girl", sAge: "18"))

//#號作爲參數名稱的前綴,從而告訴swift,使用名稱相同的本地形參名稱和外部形參名稱

func addString2(#sName: String, #sSex: String, #sAge: String) -> String{

    return "Name is " + sName + " sex is " + sSex + " age is " + sAge

}

println(addString2(sName: "sony", sSex: "boy", sAge: "19"))

//在參數類型後加 ... 聲明可變形參,可變形參是指可接受零個或多個指定類型值的形參

func addDoubles(numbers:Double...) -> Double{

    var count: Double = 0

    for number in numbers{

        count += number

    }

    return count

}

//函數的類型 (String,String,String)->String

//函數的嵌套

func myFunction(#sName:String, #sScore:Int) -> String{

    func compScore(iScore:Int) -> String{

        return String(iScore * 2)

    }

    var tmpa = ""

    tmpa = compScore(sScore)

    return "Name is " + sName + "and Score is " + tmpa

}

//17閉包

//閉包表達式的一般形式爲

/*

{

    (parameters) -> returnType in

    statements

}

*/

let names = ["Lily", "Anna", "Duty", "Poly", "Gray"]

//數組爲String類型,因此排序閉包爲(String, String)->Bool類型的函數

func compareName(s1: String, s2: String) -> Bool{

    return s1 < s2

}

//由於函數也是一種特殊的閉包,所以在這裏compareName函數也可作爲數組排序的閉包類型參數

var sortedArray = names.sorted(compareName)

//compareName函數對應的匿名閉包表達式版本的代碼

var sortedArray2 = names.sorted({ (s1:String, s2:String) -> Bool in

    return s1 < s2

})

//打印

var arrayValue = "array value:"

for str in sortedArray{

    arrayValue += (str + ",")

}

println(arrayValue)

var sortedArray3 = sorted(names, { (s1:String, s2:String) -> Bool in

    return s1 > s2

})

//trailing閉包


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章