生活随笔
收集整理的這篇文章主要介紹了
Swift3.0温习之基础篇
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前言:
重新系統的溫習一下swift3.0的東西,因為一兩個月不用,有的東西就記得不是太清楚了。以下整理了一些基礎的知識,如果哪里寫的有問題,還請指出我馬上做修改。后續還會有一些關于swift的文章會持續更新,如果有興趣請關注我。
目錄
函數使用的注意事項
類的使用
閉包
懶加載
自定義Log信息
一、函數
使用注意一
- 函數的參數,內部參數和外部參數。
- 內部參數:在函數內部可以看的見的參數是內部參數,默認都是內部參數。
- 外部參數:就是外部可以看見的參數,為外部參數。默認從參數的第二個開始都是外部參數。
//有返回值的函數
func sum(num1 : Int, num2 : Int) -> Int {return num1 + num2;
}
//不帶默認參數的函數
func makeEatFood(foodName: String) -> String {return "吃了\(foodName)"
}
使用注意二
使用注意三
//可變參數
func makeEatFood(foodName: String ...) -> String {return "吃了\(foodName)"
}makeEatFood(foodName: "河牛","海魚","馬沙")
使用注意四
- 函數的指針:使用關鍵字func swap( a : inout Int, b : inout Int){}
//函數指針,交換兩個變量的值
var a = 50
var b = 100func swap( a : inout Int, b : inout Int){let temp = aa = bb = temp
}swap(&a, &b)print("a:\(a), b:\(b)")
使用注意五
//函數嵌套使用
func nestTest(){func test1(){print("test1")}print("nestTest")//這里先被調用:1//這里調用test1()的打印情況是:先打印nestTest,再打印 test1()test1()//:2
}//這里調用的時候,只會打印nestTest,因為并沒有調用test1()這個方法
nestTest()
二、類
類的創建:class
- 分為繼承自NSObject和不繼承自NSObject。
class Person{var age : Int = 0
}let p = Person()p.age = 20
class Person : NSObject {var age : Int = 0//這時下面的代碼就非常的有用,否則就會報錯override func setValuesForKeys(_ keyedValues: [String : Any]) {}
}let p = Person()p.age = 20
//正常的情況下
//p.setValuesForKeys(["age" : 100])//不正常的情況下處理,添加沒有屬性到類屬性中
p.setValuesForKeys(["age" : 100, "name" : "marlonxlj"])
p.age
類的屬性,定義就不再做詳細介紹
class Student: NSObject {//定義屬性,需要做初始化var age : Int = 0//可選類型var name : String?var englishScore : Double = 0.0var chineseScore : Double = 0.0//計算屬性var averScore : Double {return (englishScore + chineseScore) * 0.5}//類屬性,一般用來定義單例static var stuCount : Int = 0
}//給類屬性賦值
Student.stuCount = 5//創建對象
let stu = Student()
//給對象賦值
stu.age = 10
stu.name = "marlonxlj"print(stu.age)//對可選包進行解包
if let name = stu.name{print(name)
}stu.englishScore = 80
stu.chineseScore = 50
print("\(stu.averScore)")
類的構造函數
- 構造函數類似于oc中的初始化方法:init
- 默認情況下創建一個類時,必然會調用一個構造函數
- 即便沒有寫任何的構造函數,編譯器也會提供一個默認的構造函數
- 如果繼承自NSObject可以對父類的構造函數進行重寫
構造函數的基本使用
- 類的屬性必須有值
- 如果不是在定義時初始化值,可以在構造函數中賦值
class Person : NSObject {var name : String?var age : Int = 0override init() {//在構造函數中,如果沒有明確super.init(),那么系統會默認幫我們調用//super.init()print("++++++")}//自定義構造函數init(name : String, age : Int) {self.name = nameself.age = age}init(dict : [String : AnyObject]) {let tempName = dict["name"]//as? 最終會轉換成一個可選類型name = tempName as? Stringlet tempAge = dict["age"]//as! 會轉稱成一個確定的類型,這里有一個強制解包的問題let tempAge1 = tempAge as! Intif tempAge1 != nil {age = tempAge1}if let tempAge = dict["age"] as? Int {age = tempAge}let p = Person()let p1 = Person(name: "marlonxlj", age: 25)print(p1.age)
print(p1.name)
屬性監聽器
class Person : NSObject {//屬性監聽器var totalSteps : String? {willSet{print(totalSteps)
// print(newValue)}didSet{print(totalSteps)
// print(oldValue)}}}
let p = Person()p.totalSteps = "marlonxlj"
p.totalSteps = "xiaoming"
三、閉包
- 閉包和OC中的block非常相似
- OC中的block是匿名的函數
- swift中的閉包是一個特殊的函數
- block和閉包都經常用于回調
//閉包賦值
var multipyClouser: (Int, Int) -> IntmultipyClouser = { (a: Int, b: Int) -> Int in return a * b}let result = multipyClouser(4, 2)print("result: \(result)")//閉包函數:完整寫法var multiplyClosureTola = { (a: Int, b: Int) -> Int in a * b}let rest = multiplyClosureTola(3,5)
print("mutlip:\(rest)")//函數實例
func opeartionNum(_ a: Int, _ b: Int, operation: (Int, Int) -> Int) -> Int {let restl = operation(a, b)print(restl)return restl
}//定義一個閉包
let addClouse = { (a: Int, b: Int) in a + b}opeartionNum(4, 5, operation: addClouse)
閉包循環引用的解決方法:
weak var weakself = self
- 第二種使用unowned:[unowned self]
self.view.backgroundColor = UIColor.redColor() - 第三種使用 weak self
self?. view.backgroundColor = UIColor.redColor
尾隨閉包:如果閉包作為方法的最后一個參數,那么閉包可以將()省略掉
- 1.普通寫法: loadData ({})
- 2.寫法一: loadData() {}
- 3.寫法二: loadData {}
四、懶加載
lazy var 變量: 類型 = {創建變量代碼}()
//定義了一個array數組的懶加載lazy var array: [String] = {() -> [String] in return ["marlonxlj", "marlon", "marlonxxx"]}()
extension類似OC的category,只能擴充方法,不能擴充屬性
自定義log信息
func MXLog<T>(message:T, fileName: String = #file, funcName: String = #function, lineNum: Int = #line){#if DEBUGlet filePath = (fileName as NSString).lastPathComponentprint("[\(filePath)]:\(funcName):line:\(lineNum)] -- \(message)")#endif}
???如果對你有幫助,或覺得可以。請右上角star一下,這是對我一種鼓勵,讓我知道我寫的東西有人認可,我才會后續不斷的進行完善。
有任何問題或建議請及時issues me,以便我能更快的進行更新修復。
Email: marlonxlj@163.com
轉載于:https://www.cnblogs.com/marlonxlj/p/6444992.html
總結
以上是生活随笔為你收集整理的Swift3.0温习之基础篇的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。