iOS-Senior14-Swift2

來源:互聯網
上載者:User

標籤:

1.?和!的區別

在swift中,可選類型(?)其實質是一個枚舉類型,裡面有None和Some兩種類型,其實nil的值相當於optional.None,沒有值就相當於optional.None,如果有值就相當於optional.Some

//MARK: - !和?區別

1.解包

?:有值,沒值(nil)

!:強制解包

eg: var number : Int? = 8

      var number1 = number

      print(number1)

注意:如果對沒有值的變數進行強制解包的情況下回造成崩潰

2.可選綁定,不用強制解包

if var number2 = number {

       print(number2)

}

//隱式解析可選類型:有值,沒值

var intNumber :Int != 10

var intNumber1 = intNumber

print(intNumber1)

注意:如果!強制解析沒值的變數,也會造成崩潰

可選綁定:

if var intNumber2 = number {

         print(intNumber2)

}

//MARK: - 結構體

1.聲明一個結構體

struct Rect {

//聲明結構體變數的屬性 (儲存屬性)

var x : Float

var y : Float

var width : Float 

var height : Float

//聲明結構體屬性,要使用static

static var description : String ?

//聲明一個計算屬性(是用來專門計算結構體變數屬性的setter的方法,和getter方法,其本身並沒有儲存功能)

var centerX : Float {

//set方法

set {

x = newValue

}

//get方法(必須的有)

get {

return x / 2

}

}

//聲明方法

//聲明一個結構體變數的方法(相當於oc中的執行個體方法)

func frameInfor () {

print ("x:\(x),y:\(y),width:\(width),height:\(height)")

}

//聲明一個結構體方法(相當於oc中的類方法,使用static方法修飾)

static func infor() {

print("這是結構體方法")

}

}

//1.根據結構體去定義一個結構體變數

var frame = Rect (x:10,y:10,width:100,height:100)

//2.訪問結構體變數中的屬性

//注意:結構體變數的屬性類型可以使用let去修飾,只不過訪問的時候不能對其進行修改

print(frame.x)

frame.x = 20

print(frame.x)

//3.訪問結構體屬性

Rect.description = "我是結構體屬性"

print(Rect.description)

//4.訪問計算屬性

frame.centerX = 200

//這句話就相當於在調用centerX的setter方法

let value = frame.centerX  //這句話相當於在調用center中的set方法

print(value) //這句話就相當於調用center中的get方法

frame.frameInfor() //調用結構體變數的方法

Rect.infor()  //調用結構體方法

 

//MARK: - 類(class)

class Person {

var name : String?

var age : Int?

//構造初始化方法

init(name : String age : Int) {

self.name = name

self.age = age

}

//自訂初始化方法

init(name : String) {

self.name = name

self.age = age

}

//自訂初始化方法

init(name : String) {

self.name = name

}

//聲明類屬性

static var introduce : String?

//計算屬性

var lalue : Int {

set(a) {

age = a  //在寫計算屬性的時候,一定不能出現self,否則會造成死迴圈

}

get {

return age!

}

}

//聲明一個類方法

//1.在類方法前邊加上static修飾[雖然是一個類方法,但是該方法在子類中不能重寫]

static func sayHi() {

print(introduce) //注意:在類方法中只能使用類屬性,不能使用對象屬性

}

//2.在方法前邊加上class修飾[它是一個類方法,但是可以被重寫]

class func sayHi1() {

print(introduce)

}

//聲明一個執行個體(對象)方法

func sayHi2() {

print("hello,我是執行個體方法")

}

}

//建立對象[此時應該注意和oc區別開,執行個體對象,:後邊跟的是類(注意:要初始化對象一定要寫初始化構造的方法)]

var person1 : Person = Person(name : "MBBoy",age : 69)

//訪問類中的屬性

print(person.name!)

//屬性後+?和不加+的區別就是輸出的時候,是否用解包,帶?的不用optional裡的東西,就要用!解包,而不加問號的直接輸出就可以

//3.訪問類屬性

Person.introduce = "我是xxxx"

//4.訪問計算屬性

person1.value = 28

print(person1.value)

//5.訪問類方法

Person.sayHi()

Person.sayHi1()

//6.訪問執行個體方法

person1.sayHi2()

 

//聲明一個子類方法

class Student : Person {

//重寫父類的方法

//重寫類方法

override class func sayHi() {

print("我同桌是肉絲")

}

//重寫父類中的執行個體方法

override func sayHi2() {

print("我同桌是肉絲的子類,重寫了父類中的對象方法")

}

}

var student = Student (name : "rose",age : 38)

Student.sayHi1()

Student.sayHi2()

 

//MARK: - 實值型別和參考型別的區別

//實值型別

struct animal {

var name : String?

var age : Int?

init (name :String,age : Int) {

self.name = name

self.age = age

}

}

var dog = animal (name :"貝貝",age :3)

var dog1 = dog //此時將dog的資料拷貝給dog1

dog.name = "歡歡"

print("dog.name:\(dog.name),dog1.name:\(dog1.name)")

//結果:dog.name = "歡歡",dog1.name = "貝貝"

 

//引用實值型別(可以用dog改變dog1)

class animal {

var name : String?

var age : Int?

init (name : String,age : Int) {

self.name = name

self.age = age

}

}

var dog = animal (name : "flower",age : 0)

var dog1 = dog

print ("dog.name :\(dog.name) , dog1.name : \(dog1.name)")

 

//MARK: - 協議

//當swift中聲明協議的時候,協議裡有可選方法需要使用@objc關鍵字修飾

@objc protocol MarryDelegate {

func cook() //吃飯

func wash() //洗衣服

optional func hitDouDou() //打豆豆

}

protocol DivorceDelegate {

func divideMoney()  //分割財產

}

//如果一個類要遵循協議的時候,如果這個類有父類,要在:後先寫父類,然後要遵循的協議

class Man : Person,MarryDelegate,DivorceDelegate {

@objc func cook() {

print("還好去新東方學了幾年廚師,終於可以大展身手了")

}

@objc func wash() {

print("還好有全自動洗衣機")

}

func divideMoney() {

print("分財產")

}

}

//建立一個男人

let man = Man(name :"fu",age :10)

man.cook()

man.wash()

man.divideMoney()

 

//MARK: - 擴充(extension)

//擴充協議中的相關方法(打豆豆)

extension Man {

@objc func hitDouDou() {

print("打你好爽")

}

}

man.hitDouDou()

//2.擴充還可以擴充類方法(給某一個雷添加方法,類似oc中的category類目)以及對象方法

extension Man {

//擴充一個對象方法

func sing() {

print("歌聲嘹亮惹人醉")

}

//擴充一個類方法

class func sleep() {

print("多喝水,早點睡")

}

man.sing()

man.sleep()

 

//MARK: - 閉包

//求兩個數的最大值

//使用閉包

var myBlock :((num1 : Int,num2 : Int) -> Int)

//第一種方式:

myBlock = {

(num1 : Int,num2 : Int) ->Int in //切記不能忘記in

return num1 > num2 ? num1 : num2

}

//第二種方式:

myBlock = {

num1,num2 in

return num1 > num2 ? num1 : num2

}

//第三種方式:

myBlock = {

num1,num2 in

num1 > num2 ? num1 : num2

}

//第四種方式:

myBlock: {

$0 > $1 ? $0 : $1

}

//第五種方式:

myBlock = {

(num1,num2) -> Int in

return num1 > num2 ? num1 : num2

}

let max = myBlock(num1 : 88,num2 : 66)

 

iOS-Senior14-Swift2

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.