1).元組swift
//元組賦值 let http404Error = (404,"Not Found"); //元組分解 let (statusCode,statusMessage) = http404Error; //元組分解不須要的用_代替 let (justTheStatusCode,_) = http404Error; //索引數字訪問元組 print(http404Error.0,http404Error.1); print(statusCode,statusMessage,justTheStatusCode); //給元組內部元素命名,能夠經過其訪問元素 let http200Status = (statusCode:200,description:"OK"); print(http200Status.statusCode,http200Status.description);
2).類型轉換設計模式
swift沒有隱式轉換,數據類型須要轉換到相同類型才能共同操做。數組
let m = 3; let n = 2.14; let result = Double(m)+n;
1).??ide
合併空值運算符 ( a ?? b )若是可選項 a 有值則展開,若是沒有值,是 nil ,則返回默認值 b 。表達式a 必須是一個可選類型。表達式 b 必須與 a 的儲存類型相同。函數
a != nil ? a! : bpost
let defaultColorName = "red" var userDefinedColorName: String? // defaults to nil var colorNameToUse = userDefinedColorName ?? defaultColorName print(colorNameToUse) //red
2).閉區間運算符( a...b )spa
3).半開區間運算符( a..<b 設計
for index in 1...5 { print("\(index) times 5 is \(index * 5)") } for index in 1..<5 { print("\(index) times 5 is \(index * 5)") }
1).遍歷數組的key和value代理
使用 enumerated()方法來遍歷數組。 enumerated()方法返回數組中每個元素的元組, 包含了這個元素的索引和值。你能夠分解元組爲臨時的常量或者變量做爲遍歷的一部分: for (index, value) in shoppingList.enumerated() { print("Item \(index + 1): \(value)") }
2).有序遍歷合集指針
Swift 的 Set類型是無序的。要以特定的順序遍歷合集的值,使用 sorted()方法, 它把合集的元素做爲使用 < 運算符排序了的數組返回。 for genre in favoriteGenres.sorted() { print("\(genre)") } // Classical // Hip hop // Jazz
3).Dictionary的鍵值能夠任意值
Set<Element>,Dictionary<Key, Value>,其中的Element,Key是用來做爲字典鍵的值類型, Value就是字典爲這些鍵儲存的值的類型。 值類型是遵循Hashable協議.全部 Swift 的基礎類型(好比 String, Int, Double, 和 Bool) 默認都是可哈希的,而且能夠用於合集或者字典的鍵。 沒有關聯值的枚舉成員值(如同枚舉當中描述的那樣)一樣默承認哈希。 就像數組,你能夠用初始化器語法來建立一個空 Dictionary: var namesOfIntegers = [Int: String]()
1).數字範圍縮寫
//半開半閉區間 0~9 => 0..<10 //閉區間 0~9 => 0...9 let source = 72; switch source{ case 0..<60: print("不及格"); case 60...80: print("及格"); default: break; }
2).if
判斷的條件必須只能是Bool類型,再也不存在非0即真
新增guard,else語句中通常是return、break、continue和throw
func online(age:Int){ guard age >= 18 else{ print("未成年"); return; } guard age <= 60 else{ print("年齡太老"); return; } guard age < 30 || age > 50 else{ print("回家"); return; } print("能夠上網"); } online(40);
3).switch
//switch 支持int、string、dobule //1.swift switch默認case後補break,若是想要穿透使用fallthrough let sex = 0; switch sex { case 0: print("人妖"); fallthrough; case 1: print("男"); case 2: print("女"); default: print("未知") } //2.數字範圍縮寫 //半開半閉區間 0~9 => 0..<10 //閉區間 0~9 => 0...9 let source = 72; switch source{ case 0..<60: print("不及格"); case 60...80: print("及格"); default: break; }
1)for
//swift3只支持這種寫法了 for i in 0..<10{ print(i); } //不須要用到下標 for _ in 0...10{
2)while
var m = 0; while m < 10 { m += 1;//swift3再也不支持m++這種寫法了 print(m); } repeat { m -= 1; }while m > 0
//內部參數 忽略參數名 func sum(num1:Int,_ num2:Int) ->Int{ return num1+num2; } sum(2,5); //可變函數 func sums(nums:Int...) ->Int{ var total = 0; for n in nums{ total += n; } return total; } sums(2,3,4,5,6); //默認函數 func sex(s:String = "女"){ print("sex:\(s)"); } sex() //指針函數 var m:Int = 3; var n:Int = 2; func swapNum(num1:inout Int,num2:inout Int){ let temp = num1; num1 = num2; num2 = temp; } swapNum(&m, num2: &n); print("m:\(m) n:\(n)");
//1.枚舉類型的定義以及寫法 enum MethodType1{ case get case post case put case delete } enum MethodType2:String { case get="get" case post="post" case put="put" case delete="delete" } enum MethodType3 { case get,post,put,delete } //2.建立枚舉具體的值 let type1 : MethodType1 = .get let type2 = MethodType1.get let type3 = MethodType1(rawValue:"put") let str = type3?.rawValue
結構體是值類型,在方法中是值傳遞(對象是對象類型,在方法中是指針傳遞)
//1.定義結構體 struct Location { //成員屬性 var x : Double var y : Double //方法 func test() { print("...") } //改變成員屬性:涉及到改變成員屬性的方法前需加上mutating mutating func moveH(distance : Double) { self.x += distance } //構造函數 //1.默認下,會爲結構體初始化一個帶全部屬性的構造函數 //2.構造函數都是以init開頭,而且構造函數不須要返回值 //3.新構造的構造函數,必須保證因此的成員屬性都被初始化 init(x : Double, y: Double) { self.x = x self.y = y } //擴充構造函數 init(xyStr : String) { let array = xyStr.components(separatedBy: ",") let item1 = array[0] let item2 = array[1] //Double(item1)是可選類型,有可能值爲nil。若是強制解包let x = Double(item1)! 可能會崩潰 /* if let x = Double(item1) { self.x = x }else{ self.x = 0 } if let y = Double(item2) { self.y = y }else{ self.y = 0 }*/ //是上面的縮寫,當值爲nil的時候等於後值 self.x = Double(item1) ?? 0 self.y = Double(item2) ?? 0 } } //2.建立結構體 let center = Location(x: 20, y: 30) let moveH = Location(xyStr:"20,30")
//1.OC定義類 //@interface Person : NSObject //@end // //@impelment //@end //2.Swift定義類 class Person { //若是屬性是值類型,則初始化爲空值 //若是屬性是對象類型,則初始化爲nil值(?的默認值是nil) //1.存儲屬性:用戶存儲實例的常量和變量 var mathScore : Double = 0.0 var chineseScore : Double = 0.0 var view : UIView? //2.計算屬性:經過某種方法計算得來結果的屬性,就是計算屬性 var averageScore : Double { //簡介寫法 //在類內部訪問屬性不須要加self. return (chineseScore + mathScore) * 0.5 //完整寫法 /* set { } get { return (chineseScore + mathScore) * 0.5 } */ } //3.類屬性 : 經過類名進行訪問 static var courseCount : Int = 0 //OC中處理參數的方法 在swift中能夠寫成計算屬性 func getAverageScore() -> Double { return (chineseScore + mathScore) * 0.5 } } //3.建立類的對象 let p = Person() //類儲存屬性 p.view = UIView() //類計算屬性 p.mathScore = 90 p.chineseScore = 100 print(p.averageScore) //類屬性設置 Person.courseCount = 2
class Person { var name : String = ""{ //監聽屬性即將改變 willSet(newValue){ print(newValue) //打印新值 = "why" print(name) //打印舊值 = "",屬性還沒改變 } //監聽屬性已經發生改變 didSet(oldValue){ print(oldValue) //打印舊值 = "" print(name) //打印新值 = "why",屬性已經改變 } } } let p = Person() p.name = "why"
/* 使用KVC條件 1>必須繼承自NSObject 2>必須在構造函數中,先調用super.init() 3>調用setValuesForKeys 4>若是擔憂新建對象的時候,字典裏含有的key不屬於成員變量,則複寫setValue forUndefinedKey */ class Person:NSObject { var name : String = "" var age : Int = 0 //若是須要擴展構造函數,須要先實現init,不然會被覆蓋 override init(){ } init(dict : [String : Any]) { //swift開發中,若是在對象函數中,用到成員屬性,那麼self.能夠省略 //可是若是在函數中,有和成員屬性重名的局部變量,那麼self.不能省略 //通用屬性少的時候咱們能夠這樣寫 /* if let name = dict["name"] as? String { self.name = name; } if let age = dict["age"] as? Int { self.age = age; } */ //屬性多的時候咱們能夠使用KVC賦值 super.init() setValuesForKeys(dict) } override func setValue(_ value: Any?, forUndefinedKey key: String) {} } let p = Person() let e = Person(dict:["name":"why","age":18,"height":1.88]) print(e.age,e.name)
//和OC的delloc方法同樣,監聽對象的銷燬 class Person:NSObject { var name : String = "" var age : Int = 0 //重寫析構函數,監聽對象的銷燬 deinit { print("delloc") } } var p : Person? = Person() p = nil
class Person { var book : Book? deinit { print("person -- deinit") } } class Book { /* OC中的標識弱引用 __weak/__unsafe_unretianed(當對象釋放了,指針依然指向舊地址,因此容易野指針) Swift中表示弱引用 weak/unowned(野指針) */ //unowned 不能修飾可選類型 // unowned var person : Person = Person() weak var person : Person? deinit { print("book -- deinit") } } var person : Person? = Person() var book : Book? = Book() person!.book = book; book!.person = person; //若是不使用弱引用這個時候析構函數不打印 person = nil; book = nil;
class Person { var name : String = "" var dog : Dog? } class Dog { var weight : Double = 0 var toy : Toy? } class Toy { var price : Int = 0 func flying(){ print("fly") } } let p = Person() p.name = "why" let d = Dog() d.weight = 100.5 let t = Toy() t.price = 5 p.dog = d d.toy = t //可選鏈 .? 系統會自動判斷可選類型是否有值 //可選鏈--取值 /* 寫法很是危險,儘可能不要強制解包 let dog = p.dog let toy = dog!.toy let price = toy!.price */ /* 寫法很繁雜 if let dog = p.dog { if let toy = dog.toy { let price = toy.price } } */ let price = p.dog?.toy?.price //可選鏈--賦值 p.dog?.toy?.price = 100 //可選鏈調用方法 p.dog?.toy?.flying()
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground" //1.協議的定義,默認協議中的方法都是必須實現 protocol SportProtocol { func playBasketll() } //2.遵照協議,能夠遵循多個協議,逗號個隔開 class Teacher : NSObject,SportProtocol{ func playBasketll() { print("踢足球") } } //3.協議的代理設計模式 /* 定義協議時,協議後面最好跟上:class, 由於delegate的屬性避免循環引用,用week修飾,而week只能修飾類、屬性。協議能夠被類遵照,也能夠被枚舉、結構體 */ protocol BuyTicketDelegate : class { func buyTicket() } class Person { //定義代理屬性 weak var delegate : BuyTicketDelegate? func gotoBeijing() { delegate?.buyTicket() } } class Stundnt : BuyTicketDelegate { internal func buyTicket() { print("買票") } } let p = Person() let s = Stundnt() p.delegate = s s.buyTicket() //4.協議的可選方法 //optional屬於OC特性,若是協議中有可選方法,那麼必須在protocol前加@objc @objc protocol TestPro { @objc optional func test() }
Swift 擁有內置的對 API 可用性的檢查功能,它可以確保你不會悲劇地使用了對部屬目標不可用的 API。
if #available(iOS 10, macOS 10.12, *) { // Use iOS 10 APIs on iOS, and use macOS 10.12 APIs on macOS } else { // Fall back to earlier iOS and macOS APIs }