1. 程式人生 > >IOS學習筆記05_1-Swift-如何定義類和類的構造方法、過載方法

IOS學習筆記05_1-Swift-如何定義類和類的構造方法、過載方法

二〇一五年八月十二日 10:36:11  今天學習一下 Swift的函式

1,函式的寫法,和構造方法

import Foundation

class helloword{
    
    var mingzi:String? = "zhanglaosan"//還記得這個不? 可選引數   
    
    init(name:String){//初始化方法(構造方法)
        mingzi = name;
        
    }
    init(){//過載構造方法
        
    }
    func sayhello(){
        
        println("welcome,\(mingzi!)")
        
    }
    
}

//建立類例項,<span style="font-family: Arial, Helvetica, sans-serif;">如果這裡傳值就用帶引數的構造方法init(name:String),</span><span style="font-family: Arial, Helvetica, sans-serif;">//如果沒有傳值就用無引數構造方法init()</span>
var h = helloword(name:"lisi")
h.sayhello()

init 是初始化函式   一共定義了兩個構造方法   一個是有引數的,一個是無引數的

當執行  h.sayhello()的時候會先判斷 h是帶引數的還是不帶引數的,如果

var h = helloword()   

那麼就會輸出 welcome,zhanglaosan,如果是帶引數的

var h = helloword(name:"lisi")
那麼就會輸出 welcome,lisi

這裡要說一下,其實這個說法我也不太確定,剛才搜了一下 init 只是初始化方法,為什麼叫構造方法,和過載,這兩個定義我還是沒理解透!希望有大牛知道能教授一下我

初始化

構造

過載

多型等等   面向物件的這幾個形式我還是沒理解透………………   只是大概知道意思但是不知道怎麼解釋。。。。。。。求教

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2,類方法(靜態方法)

import Foundation


class helloword{
    
    class func sayhi(){//靜態方法,不用像1例子裡要建立例項就可以直接通過類呼叫
        println("hello wangwu")
    }
}

helloword.sayhi()
輸出結果: hello wangwu ------------------------------------------------------------------------------------------------------------------------------------------------------------------------

3,類的繼承 

//
//  main.swift
//  classfunc
//
//  Created by kilon-apple on 15/8/11.
//  Copyright (c) 2015年 kilon-apple. All rights reserved.
//

import Foundation

class helloword{
    
    var mingzi:String? = "zhanglaosan"
    
    init(name:String){//初始化方法(構造方法)
        mingzi = name;
        
    }
    init(){//過載構造方法
        
    }
    func sayhello(){
        
        println("welcome,\(mingzi!)")
        
    }
    
    class func sayhi(){
        println("hello wangwu")
    }
}

class Hi:helloword{//定義Hi類,繼承自helloword  
    
}
 
var hi = Hi()
hi.sayhello()//呼叫
Hi.sayhi()//呼叫
猜猜輸出結果是什麼:?███████████

我猜是:welcome,zhanglaosan

                hello wangwu

輸出結果:welcome,zhanglaosan
hello wangwu

---------------------------------------------------------------------

3_1,繼承序章:重寫

import Foundation

class helloword{
    
    var mingzi:String? = "zhanglaosan"
    
    init(name:String){//初始化方法(構造方法)
        mingzi = name;
        
    }
    init(){//過載構造方法
        
    }
    func sayhello(){
        
        println("welcome,\(mingzi!)")
        
    }
    
    class func sayhi(){
        println("hello wangwu")
    }
}

class Hi:helloword{
    
    override func sayhello() {//重寫要加關鍵字 override ,在Xcolde裡直接在繼承的方法裡打 sayhello 就會顯示提示直接敲回車就出來了很方便。
        println("computer say 'Hi,\(mingzi!)!'")
    }
    
}

var hi = Hi(name:"kilon")//帶參構造方法
hi.sayhello()
Hi.sayhi()
輸出結果 :computer say 'Hi,kilon!'

                  hello wangwu

---------------------------------------------------------------------

3_2,繼承序章:執行父類的方法(執行靜態方法)

//
//  main.swift
//  classfunc
//
//  Created by kilon-apple on 15/8/11.
//  Copyright (c) 2015年 kilon-apple. All rights reserved.
//

import Foundation

class helloword{
    
    var mingzi:String? = "zhanglaosan"
    
    init(name:String){//初始化方法(構造方法)
        mingzi = name;
        
    }
    init(){//過載構造方法
        
    }
    func sayhello(){
        
        println("welcome,\(mingzi!)")
        
    }
    
    class func sayhi(){
        println("hello 斤斤計較斤斤計較")
    }
}

class Hi:helloword{
    
    override func sayhello() {
        super.sayhello()//使用父類方法
        println("computer say 'Hi,\(mingzi!)!'")
    }
//    override init(name: String) {//當然還可以這樣重寫構造方法 但是下邊的 \(mingzi!)會報錯。不曉得為啥。。。。為啥上邊的mingzi可以用,這個就不能用了內?
//         println("computer say 'Hi,\(mingzi!)!'")
//    }
    
}
var hi = Hi(name:"kilon")
hi.sayhello()

Hi.sayhi()
輸出結果:

welcome,kilon
computer say 'Hi,kilon!'
hello 斤斤計較斤斤計較

</pre>這裡有個一問點:  我使用父類的靜態方法是在<pre name="code" class="objc">println("computer say 'Hi,\(mingzi!)!'")
之前,為什麼執行結果確實在 他之後顯示……     這個有大牛知道麼?求解。。。。



------------------------------------------------------------------------------------------------------------------------------------------------------------------------

4,Swift語言類的動態擴充套件功能

應用場景:比如說我們在使用第三方框架,或者是在使用系統中的某一個類,我們發先這樣的類的功能並不能滿足我的們的要求,那麼這時候就需要我們自己手動的擴充套件這個類的功能

這種擴充套件可以在不改變類的繼承結構的情況下實現我們的要求。

import Foundation

class helloword{
    
    var mingzi:String? = "zhanglaosan"
    
    init(name:String){//初始化方法(構造方法)
        mingzi = name;
        
    }
    init(){//過載構造方法
        
    }
    func sayhello(){
        
        println("welcome,\(mingzi!)")
        
    }
    
    class func sayhi(){
        println("hello 斤斤計較斤斤計較")
    }
}

class Hi:helloword{
    
    override func sayhello() {
        super.sayhello()//使用父類方法
        println("computer say 'Hi,\(mingzi!)!'")
    }
    
}

extension Hi{//動態擴充套件類     關鍵字   extension  強調: 這裡只要擴充套件了Hi的類,那麼Hi的子類裡都會有這個擴充套件的類   如 4_1 例項所示

    func sayhaha(){
    
    println("wa ha ha ha ha !")
    }
    
}

//var h = helloword(name:"lisi")//如果這裡傳值就用帶引數的構造方法init(name:String),如果沒有傳值就用無引數構造方法init()
//h.sayhello()
//
//helloword.sayhi()


var hi = Hi(name:"kilon")
hi.sayhello()

Hi.sayhi()
hi.sayhaha()
輸出結果:

welcome,kilon
computer say 'Hi,kilon!'
hello 斤斤計較斤斤計較
wa ha ha ha ha !

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

4_1 擴充套件後的子類例項

<pre name="code" class="objc">import Foundation

class helloword{
    
}

class Hi:helloword{
    
    
}


class Hison:Hi{
}

extension Hi{
    
    func sayhaha(){
        
        println("wa ha ha ha ha !")
    }
    
}
var hh = Hison()
hh.sayhaha()

輸出結果:  wa ha ha ha ha !

------------------------------------------------------------------------------------------------------------------------------------------------------------------------

5,Swift 使用介面(Protocol)   * 在Swift裡介面叫 Protocol (協議的意思)  不是interface

import Foundation


protocol person {//定義介面  關鍵字 Protocol 


    func getName()->String//定義方法 getName 返回值型別為String
}


class ren:person{//實現介面  方法類似於類與類之間的繼承   


    func getName() -> String {//這裡在Xcolde 裡敲get回車,就能直接補全了   這裡要實現這個介面的方法否則會報錯
        return "zhangsan"
    }
    
}


var r = ren()  
println("name is \(r.getName())")//執行接口裡的方法
輸出結果:

name is zhangsan


------------------------------------------------------------------------------------------------------------------------------------------------------------------------

還有一文名稱空間我想放在單獨的文章裡做記錄!!二〇一五年八月十二日 13:55:53