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:運算符前的可選值a爲nil時返回操作數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 使switch中case代碼繼續連接到下一個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閉包