版本記錄
版本號(hào) | 時(shí)間 |
---|---|
V1.0 | 2017.07.18 |
前言
我是swift2.0的時(shí)候開始接觸的乌助,記得那時(shí)候還不是很穩(wěn)定陌知,公司的項(xiàng)目也都是用oc做的,并不對(duì)swift很重視仆葡,我自己學(xué)了一段時(shí)間沿盅,到現(xiàn)在swift3.0+已經(jīng)出來了,自己平時(shí)也不寫腰涧,忘記的也差不多了南窗,正好項(xiàng)目這段時(shí)間已經(jīng)上線了郎楼,不是很忙窒悔,我就可以每天總結(jié)一點(diǎn)了,希望對(duì)自己對(duì)大家有所幫助阶界。在總結(jié)的時(shí)候我會(huì)對(duì)比oc進(jìn)行說明聋庵,有代碼的我會(huì)給出相關(guān)比對(duì)代碼。
1. swift簡單總結(jié)(一)—— 數(shù)據(jù)簡單值和類型轉(zhuǎn)換
2. swift簡單總結(jié)(二)—— 簡單值和控制流
3. swift簡單總結(jié)(三)—— 循環(huán)控制和函數(shù)
函數(shù)
1. 函數(shù)作為參數(shù)傳入另一個(gè)函數(shù)
前面在講函數(shù)的時(shí)候氧映,我們看到函數(shù)是可以嵌套的脱货,還可以作為返回值返回振峻,這里我們講另外一種情況,那就是函數(shù)作為參數(shù)進(jìn)行傳遞扣孟,也就是說凤价,函數(shù)的參數(shù)是另外一個(gè)參數(shù)。
下面我們就看一下 swift
中的代碼。
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
//函數(shù)作為參數(shù)進(jìn)行傳遞
let numbers = [20, 15, 18, 9]
let matchCondition = match(list: numbers, condition: lessThan)
print(matchCondition)
}
//函數(shù)作為參數(shù)進(jìn)行傳遞
func match(list : [Int], condition:(Int) -> Bool) -> Bool {
for item in list {
if condition(item) {
return true
}
}
return false;
}
func lessThan(number : Int) -> Bool {
return number < 18
}
2. 函數(shù)的本質(zhì)
函數(shù)的本質(zhì)其實(shí)就是一種特殊的閉包立轧,可以使用{}
來創(chuàng)建一個(gè)匿名閉包躏吊,使用in
將參數(shù)和返回值類型聲明與閉包函數(shù)體進(jìn)行分離。
//函數(shù)實(shí)質(zhì)上就是閉包
numbers.map({
(number : Int) -> Int in
let result = number * 3
return result
})
如果一個(gè)閉包的類型已知胜卤,比如作為一個(gè)回調(diào)函數(shù)赁项,你可以忽略參數(shù)的類型和返回值,單個(gè)語句閉包會(huì)把它語句的值單做結(jié)果返回舰攒。
let mappedNumbers = numbers.map({number in 3 * number})
可以通過參數(shù)位置而不是參數(shù)名字來引用參數(shù)摩窃,這個(gè)方法在非常短的閉包中非常有用,當(dāng)一個(gè)閉包作為最后一個(gè)參數(shù)傳給一個(gè)函數(shù)的時(shí)候猾愿,它可以直接跟在括號(hào)后面蒂秘。
let sortNumbers = sorted(numbers) {$0 > $1}
類
1. 類的創(chuàng)建
使用class
和類名創(chuàng)建一個(gè)類,類中屬性的聲明和常量观挎、變量聲明一樣段化,唯一的區(qū)別是它們的上下文是類,同樣雄嚣,方法和函數(shù)聲明也一樣喘蟆。
下面看一下代碼
class name{
var number = 0
func myname() -> String {
return "John"
}
}
要?jiǎng)?chuàng)建一個(gè)類的實(shí)例,在類名后面加上括號(hào)港谊,使用點(diǎn)語法來訪問實(shí)例的屬性和方法橙弱。
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
//類實(shí)例化
var nameInstance = name()
nameInstance.number = 10
var nameFunc = nameInstance.myname()
print(nameFunc)
}
}
下面我們就直接看輸出
John
2. 構(gòu)造器
一個(gè)構(gòu)造函數(shù)來初始化實(shí)例棘脐,使用init
來創(chuàng)建一個(gè)構(gòu)造器。
下面看代碼顷链。
class NamedShape{
var numberOfSlides : Int = 0
var name : String
init(name : String) {
self.name = name
}
func simpleDescription() -> String {
return "A shape with \(numberOfSlides) sides."
}
}
這里self
被用來區(qū)別實(shí)例變量屈梁,當(dāng)你創(chuàng)建實(shí)例的時(shí)候,像傳入?yún)?shù)一樣給類傳入構(gòu)造器參數(shù)潭苞,每個(gè)屬性都需要賦值——無論是通過聲明(就像numberOfSlides
)或者是通過構(gòu)造器(就像name
)此疹。
如果你需要在刪除對(duì)象之前進(jìn)行一些清理工作,使用deinit
創(chuàng)建一個(gè)析構(gòu)函數(shù)湖笨。
3. 子類的定義
子類的定義就是在其類名后面加上父類的名字蹦骑,用冒號(hào)分割,創(chuàng)建類的時(shí)候并不需要一個(gè)標(biāo)準(zhǔn)的根類边败,所以可以忽略父類捎废。
我們先看一下swift
中是如何定義子類的,看代碼排截。
class JJSwiftVC: UIViewController
{
}
上面就是定義了一個(gè)子類JJSwiftVC
辐益,再比如
class name{
var number = 0
func myname() -> String {
return "John"
}
}
這個(gè)類就沒有指定父類智政。
那么我們?cè)诳匆幌?code>oc中子類的定義,看代碼续捂。
#import <UIKit/UIKit.h>
@interface JJOCVC : UIViewController
@end
我們可以得到如下結(jié)論:
- oc和swift子類和父類之間都是以冒號(hào)隔開疾忍。
- oc中繼承父類是寫在
.h
文件中床三,swift則不分文件。 - oc在新建文件的時(shí)候就要指定父類聂渊,且不能省略,swift可以不知道根類欲逃。
4.子類重寫父類的方法
swift
和oc
一樣饼暑,子類可以重寫父類的方法,swift
中子類要重寫父類的方法彰居,需要用override
標(biāo)記撰筷,沒有這個(gè)標(biāo)志就重寫父類方法會(huì)報(bào)錯(cuò)毕籽,下面我們就看一下代碼。
class NamedShape
{
var numberOfSlides : Int = 0
var name : String
init(name : String) {
self.name = name
}
func simpleDescription() -> String {
return "A shape with \(numberOfSlides) sides."
}
}
class Square : NamedShape
{
override func simpleDescription() -> String {
return "子類在重寫父類方法"
}
}
下面我們看一下oc
中是如何重寫父類方法的溶握。
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor lightGrayColor];
self.imageArr = [self loadGifImageArr];
[self setupUI];
}
這就是典型的重寫父類的方法奈虾,不用任何標(biāo)志廉赔,直接在子類里實(shí)現(xiàn)父類的方法就是相當(dāng)于重寫父類的方法了。
5. 屬性的getter&setter方法
下面我們看一下swift
中的setter
和getter
方法碉纳,看代碼馏艾。
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
let triangle = EquilateralTriangle(sideLength: 3.1, name: "a triangle")
print(triangle.permeter)
triangle.permeter = 9.9
print(triangle.sideLength)
}
}
class EquilateralTriangle : NamedShape
{
var sideLength : Double = 0.0
init(sideLength : Double, name : String) {
self.sideLength = sideLength
super.init(name: name)
numberOfSlides = 3
}
var permeter : Double{
get {
return 3.0 * sideLength
}
set{
sideLength = newValue / 3.0
}
}
override func simpleDescription() -> String {
return "An equilateral Triangle with sides of lenght \(sideLength)"
}
}
下面我們看結(jié)果輸出琅摩。
9.3
3.3
上面的不難理解,getter
方法是3.0 * sideLength
蜕劝,3.1 * 3 = 9.3,后面的setter方法是新值9.9 / 3 = 3.3暑始。
這里婴削,類EquilateralTriangle
的構(gòu)造器,需要執(zhí)行三步:
- 設(shè)置子類聲明的屬性值
- 調(diào)用父類的構(gòu)造器
- 改變父類定義的屬性值嗤朴,其他的工作比如調(diào)用方法互躬,getter和setter也可以在這個(gè)階段完成吼渡。
如果不需要計(jì)算屬性,但是仍然需要在設(shè)置一個(gè)新值之前或者之后運(yùn)行代碼坎背〖娜福可以使用willSet
和didSet
。
下面我們看一下代碼懂更。
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
let triangleAndSqure = TriangleAndSquare(size : 10, name : "another test shape")
print(triangleAndSqure.square.sideLength)
print(triangleAndSqure.triangle.sideLength)
triangleAndSqure.square = Square(sideLength: 50, name: "larger square")
}
}
class TriangleAndSquare
{
var triangle : EquilateralTriangle{
willSet {
square.sideLength = newValue.sideLength
}
}
var square : Square{
willSet {
triangle.sideLength = newValue.sideLength
}
}
init(size : Double, name : String) {
square = Square(sideLength : size, name : name)
triangle = EquilateralTriangle(sideLength: size, name: name)
}
}
上面的就是swift
中的getter和setter方法沮协,不知道大家是否記得oc
中的getter和setter方法卓嫂。
- oc中的getter方法用點(diǎn)語法就可以點(diǎn)出來。
- oc中的setter方法也可以使用點(diǎn)語法進(jìn)行賦值行瑞。
- oc中的getter和setter方法都可以重寫餐禁。
6. 類中的方法和函數(shù)
類中的方法和函數(shù)有一個(gè)重要的區(qū)別帮非,函數(shù)的參數(shù)名只能在函數(shù)內(nèi)部使用绷旗,但是方法的參數(shù)名需要在調(diào)用的時(shí)候顯示說明(除了第一個(gè)參數(shù))副砍,默認(rèn)情況下豁翎,方法的參數(shù)名和它在方法內(nèi)部的名字一樣隅忿,不過你可以定義第二個(gè)名字滨巴,這個(gè)名字被用在方法內(nèi)部庸娱,下面看代碼畦娄。
class JJSwiftVC: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
view.backgroundColor = UIColor.lightGray
var counter = Counter()
counter.incrementBy(2, numberOfTimes: 7)
}
}
class Counter
{
var count : Int = 0
func incrementBy(amount : Int, numberOfTimes times : Int){
count += amount * times
print(count)
}
}
下面看輸出結(jié)果
14
這里可見:
- 這里
times
就是給numberOfTimes
起的別名熙卡。
還需要說明的是励饵,在操作可選值的時(shí)候役听,在操作之前加上?
,如果?
之前是nil
甜滨,?
后面的東西都會(huì)被忽略熙参,并且整個(gè)表達(dá)式會(huì)返回nil
,否則昭娩,?
之后的東西都會(huì)被運(yùn)行黍匾,在這兩種情況下锐涯,整個(gè)表達(dá)式的值是一個(gè)可選值。
下面我們看一下代碼霎终。
let optionalSquare : Square? = Square(sideLength : 2.5, name : "optional square")
let sideLength = optionalSquare. sideLength
后記
已經(jīng)很晚了,今天就寫這么多吧击困,未完广凸,待續(xù)~~~