swift簡單總結(jié)(二十五)—— 構(gòu)造過程

版本記錄

版本號 時間
V1.0 2017.07.30

前言

我是swift2.0的時候開始接觸的,記得那時候還不是很穩(wěn)定妓蛮,公司的項目也都是用oc做的,并不對swift很重視,我自己學(xué)了一段時間纽疟,到現(xiàn)在swift3.0+已經(jīng)出來了罐韩,自己平時也不寫,忘記的也差不多了污朽,正好項目這段時間已經(jīng)上線了散吵,不是很忙,我就可以每天總結(jié)一點了蟆肆,希望對自己對大家有所幫助矾睦。在總結(jié)的時候我會對比oc進行說明,有代碼的我會給出相關(guān)比對代碼炎功。
1. swift簡單總結(jié)(一)—— 數(shù)據(jù)簡單值和類型轉(zhuǎn)換
2. swift簡單總結(jié)(二)—— 簡單值和控制流
3. swift簡單總結(jié)(三)—— 循環(huán)控制和函數(shù)
4. swift簡單總結(jié)(四)—— 函數(shù)和類
5. swift簡單總結(jié)(五)—— 枚舉和結(jié)構(gòu)體
6. swift簡單總結(jié)(六)—— 協(xié)議擴展與泛型
7. swift簡單總結(jié)(七)—— 數(shù)據(jù)類型
8. swift簡單總結(jié)(八)—— 別名枚冗、布爾值與元組
9. swift簡單總結(jié)(九)—— 可選值和斷言
10. swift簡單總結(jié)(十)—— 運算符
11. swift簡單總結(jié)(十一)—— 字符串和字符
12. swift簡單總結(jié)(十二)—— 集合類型之數(shù)組
13. swift簡單總結(jié)(十三)—— 集合類型之字典
14. swift簡單總結(jié)(十四)—— 控制流
15. swift簡單總結(jié)(十五)—— 控制轉(zhuǎn)移語句
16. swift簡單總結(jié)(十六)—— 函數(shù)
17. swift簡單總結(jié)(十七)—— 閉包(Closures)
18. swift簡單總結(jié)(十八)—— 枚舉
19. swift簡單總結(jié)(十九)—— 類和結(jié)構(gòu)體
20. swift簡單總結(jié)(二十)—— 屬性
21. swift簡單總結(jié)(二十一)—— 方法
22. swift簡單總結(jié)(二十二)—— 下標腳本
23. swift簡單總結(jié)(二十三)—— 繼承
24. swift簡單總結(jié)(二十四)—— 構(gòu)造過程

構(gòu)造過程

上一篇講構(gòu)造過程沒有講完,下面我們繼續(xù)看下面兩個方面蛇损。

  • 類的繼承和構(gòu)造過程
  • 通過閉包和函數(shù)來設(shè)置屬性的默認值

類的繼承和構(gòu)造過程

類里面的所有存儲型屬性赁温,包括所有繼承自父類的屬性,都必須在構(gòu)造過程中設(shè)置初始值淤齐。swift提供了兩種類型的類構(gòu)造器來確保所有類實例中存儲型屬性都能獲得初始值股囊,分別是指定構(gòu)造器和便利構(gòu)造器。

1. 指定構(gòu)造器和便利構(gòu)造器

指定構(gòu)造器是類中最主要的構(gòu)造器更啄,一個指定構(gòu)造器將初始化類中提供的所有屬性稚疹,并根據(jù)父類鏈往上調(diào)用父類的構(gòu)造器來實現(xiàn)父類的初始化。

每一個類都必須擁有至少一個指定構(gòu)造器祭务,在某些情況下内狗,許多類通過繼承了父類中的指定構(gòu)造器而滿足了這個條件。

便利構(gòu)造器時類中比較次要的义锥、輔助型的構(gòu)造器其屏,你可以定義便利構(gòu)造器來調(diào)用同一個類中的指定構(gòu)造器,并為其參數(shù)提供默認值缨该,你也可以定義便利構(gòu)造器來創(chuàng)建一個特殊用途或特定輸入的實例偎行。

一般只在必要的時候才為類提供便利構(gòu)造器。

2. 構(gòu)造器鏈

為簡化指定構(gòu)造器和便利構(gòu)造器之間的調(diào)用關(guān)系贰拿,swift采用以下三條規(guī)則來限制構(gòu)造器之間的代理調(diào)用蛤袒。

  • 指定構(gòu)造器必須調(diào)用其直接父類的指定構(gòu)造器
  • 便利構(gòu)造器必須調(diào)用同一類中定義的其他構(gòu)造器
  • 便利構(gòu)造器必須最終以調(diào)用一個指定構(gòu)造器結(jié)束

或者可以這么記錄

  • 指定構(gòu)造器必須總是向上代理
  • 便利構(gòu)造器必須總是橫向代理

具體如下所所示:

圖示

這里可以看到:

  • 父類中包含一個指定構(gòu)造器和兩個便利構(gòu)造器,其中一個變遍歷構(gòu)造器就調(diào)用了另外一個便利構(gòu)造器膨更,而后者又調(diào)用了唯一的指定構(gòu)造器妙真。
  • 子類中包含兩個指定構(gòu)造器和一個便利構(gòu)造器,便利構(gòu)造器必須調(diào)用兩個指定構(gòu)造器中的任意一個荚守。
  • 上圖中展示的構(gòu)造器都可以用來完整創(chuàng)建對應(yīng)類的實例珍德,這些規(guī)則只在實現(xiàn)類的定義時有影響练般。

在看一下下面的四個類的例子,演示指定構(gòu)造器時如何在類層級中充當“管道”的作用锈候,在類的構(gòu)造器鏈上簡化了類之間的相互關(guān)系薄料。

四類構(gòu)造器鏈

3. 兩段式構(gòu)造過程

swift中類的構(gòu)造過程包含連個階段:第一階段,每個存儲型屬性通過引入它們的類的構(gòu)造器來設(shè)置初始值泵琳,當每一個存儲型屬性值確定后摄职;第二個階段,它給每個類一次機會在新實例準備使用之前進一步定制它們的存儲型屬性获列。

注意swift的兩段式構(gòu)造過程和OC中的構(gòu)造過程類似谷市,主要區(qū)別在與階段1,OC給每一個屬性賦值為0或空值击孩,swift的構(gòu)造流程則更加靈活迫悠,它允許你設(shè)置定制的初始值,并自如應(yīng)對某些屬性不能以0nil作為合法默認值的情況巩梢。

swift編譯器將執(zhí)行4中有效的安全檢查及皂,確保兩段式構(gòu)造過程能順利完成。

  • 安全檢查1:指定構(gòu)造器必須保證它所在類引入的所有屬性都必須先初始化完成且改,之后才能將其他構(gòu)造任務(wù)向上代理給父類中的構(gòu)造器验烧。一個對象的內(nèi)存只有在其所有存儲型確定之后才能完成初始化,為滿足這一點又跛,指定構(gòu)造器必須保證它所在類引入的屬性在它往上代理之前完成初始化碍拆。
  • 安全檢查2:指定構(gòu)造器必須先向上代理調(diào)用父類構(gòu)造器,然后再為繼承的屬性設(shè)置新值慨蓝,如果不這么做感混,指定構(gòu)造器賦予的新值將被父類中的構(gòu)造器所覆蓋。
  • 安全檢查3:便利構(gòu)造器必須先代理調(diào)用同一類中的其他構(gòu)造器礼烈,然后再為任意屬性賦新值弧满,如果不這么做,便利構(gòu)造器的新值將被同一類中其他指定構(gòu)造器所覆蓋此熬。
  • 安全檢查4:構(gòu)造器在第一階段完成之后庭呜,不能調(diào)用任何實例方法,不能讀取任何示例屬性的值犀忱,self的值不能被引用募谎。

下面是兩段式構(gòu)造過程中基于上述安全檢查的構(gòu)造流程展示。

階段1:

  • 某個指定構(gòu)造器或便利構(gòu)造器被調(diào)用
  • 完成新實例內(nèi)存分配阴汇,但此時內(nèi)存還沒被初始化
  • 指定構(gòu)造器確保其所在類引入的所有存儲型屬性都已賦初值数冬,存儲型屬性所屬的內(nèi)存完成初始化
  • 指定構(gòu)造器將調(diào)用父類的構(gòu)造器,完成父類屬性的初始化
  • 這個調(diào)用父類構(gòu)造器的過程沿著構(gòu)造器鏈一直往上執(zhí)行搀庶,直到達到構(gòu)造器最頂部
  • 當?shù)竭_了最頂部拐纱,且已確保所有實例包含的存儲型屬性都已經(jīng)賦值铜异,這個實例的內(nèi)存被認為已經(jīng)完全初始化完成,1階段完成秸架。

階段2

  • 從頂部構(gòu)造器鏈一直往下揍庄,每個構(gòu)造器鏈中類的指定構(gòu)造器都有機會進一步定制實例,構(gòu)造器此時可以使用self咕宿,修改它的屬性并調(diào)用實例方法等。
  • 最終蜡秽,任意構(gòu)造器鏈中的便利構(gòu)造器可以有機會定制實例和使用self

下面圖展示的子類和父類之間構(gòu)造的階段1

階段1

構(gòu)造過程從對子類中一個便利構(gòu)造器的調(diào)用開始府阀,這個便利構(gòu)造器此時沒法修改任何屬性,它把構(gòu)造任務(wù)代理給同一個類中的指定構(gòu)造器芽突,指定構(gòu)造器將確保所有子類的屬性都有值试浙,然后它將調(diào)用父類的指定構(gòu)造器,并沿著構(gòu)造器鏈一直往上完成父類的構(gòu)建過程寞蚌。一旦父類中所有屬性都有了初始值田巴,實例的內(nèi)存被認為是完全初始化,階段1完成挟秤。

下面看一下階段2

階段2

4. 構(gòu)造器的繼承和重載

OC不同的是壹哺,swift的子類不會默認繼承父類的構(gòu)造器,swift的這種機制艘刚,可以防止一個父類的簡單構(gòu)造器被一個更專業(yè)的子類繼承管宵,并被錯誤的用來創(chuàng)建子類的實例。

假如你希望自定義的子類中能實現(xiàn)一個或多個跟父類相同的構(gòu)造器攀甚,也許是為了完成一些定制的構(gòu)造過程箩朴,你可以在你定制的子類提供和重載與父類相同的構(gòu)造器,如果你重載的構(gòu)造器是一個指定構(gòu)造器秋度,你可以在子類里重載它的實現(xiàn)炸庞,并在自定義版本的構(gòu)造器中調(diào)用父類版本的構(gòu)造器,如果你重載的構(gòu)造器是一個便利構(gòu)造器荚斯,你的重載過程必須通過調(diào)用同一類中提供的其他指定構(gòu)造器來實現(xiàn)埠居。

注意: 與方法、屬性和下標不同事期,在重載構(gòu)造器時你沒必要使用關(guān)鍵字override

5. 自動構(gòu)造器的繼承

子類不會默認繼承父類的構(gòu)造器拐格,但是如果特定條件可以滿足,父類構(gòu)造器可以被自動繼承刑赶。

假如要為子類中引入的任意新屬性提供默認值捏浊,請遵守以下2個規(guī)則。

規(guī)則1

如果子類沒有定義任何指定構(gòu)造器撞叨,它將自動繼承所有父類的指定構(gòu)造器金踪。

規(guī)則2

如果子類提供了所有父類指定構(gòu)造器的實現(xiàn)浊洞,不管是通過規(guī)則1繼承過來的,還是通過自定義實現(xiàn)的胡岔,它將自動繼承所有父類的便利構(gòu)造器法希。

即使你在子類中添加了更多的便利構(gòu)造器,這兩條規(guī)則仍然適用靶瘸,

注意:子類可以通過部分滿足規(guī)則2的方式苫亦,使用子類便利構(gòu)造器來實現(xiàn)父類的指定構(gòu)造器。

6. 指定構(gòu)造器和便利構(gòu)造器語法

類的指定構(gòu)造器寫法和值類型簡單構(gòu)造器一樣怨咪,如下所示:

init(parameter){
    statements
}

便利構(gòu)造器也是一樣寫法屋剑,但是需要在init關(guān)鍵字之前放置convenience關(guān)鍵字。

convenience init(parameter){
    statements
}

7. 指定構(gòu)造器和便利構(gòu)造器實戰(zhàn)

下面將會代碼展示指定構(gòu)造器诗眨、便利構(gòu)造器和自動構(gòu)造器的繼承唉匾。

先提供基類Food,是一個簡單的用來封裝食物名字的類匠楚,看代碼巍膘。

class Food {
    var name : String
    init(name : String) {
        self.name = name
    }
    convenience init() {
        self.init(name: "Unnamed")
    }
}

下面看一下,Food類的構(gòu)造器鏈:

Food構(gòu)造器鏈

類沒有提供一個逐一成員構(gòu)造器芋簿,所以Food類提供了一個接受單一參數(shù)name的指定構(gòu)造器峡懈,這個構(gòu)造器可以使用一個特定的名字創(chuàng)建實例。

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray
        
        let nameMeat = Food(name: "Bacon")
        print(nameMeat.name)
    }
}

下面看輸出結(jié)果

Bacon

Food類構(gòu)造器init(name : String)被定義為一個指定構(gòu)造器与斤,能確保新Food實例中存儲型屬性都被初始化逮诲,Food類沒有父類,所以init(name : String)構(gòu)造器不需要調(diào)用super.init()來完成構(gòu)造幽告。

Food類也提供了一個沒有參數(shù)的便利構(gòu)造器init()梅鹦,這個init()構(gòu)造器為新食物提供了一個默認的占位名字,通過代理調(diào)用同一個類中定義的指定構(gòu)造器init(name : String)并給參數(shù)name傳值"Unnamed"來實現(xiàn)冗锁。

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray
        
        let nameMeat = Food()
        print(nameMeat.name)
    }
}

下面看輸出結(jié)果

Unnamed

接著定義第二個類齐唆,繼承自Food,擁有Int類型的數(shù)量屬性quantity還有就是從Food繼承過來的name屬性冻河。并且也定義了兩個構(gòu)造器來創(chuàng)建實例箍邮。

class RecipIngredient: Food {
    var quantity : Int
    init(name : String, quantity : Int){
        self.quantity = quantity
        super.init(name: name)
    }
    
   override convenience  init(name: String) {
        self.init(name: name, quantity: 1)
    }
}

下面展示的是RecipIngredient的構(gòu)造器鏈。

構(gòu)造器鏈

RecipIngredient類有一個指定構(gòu)造器init(name : String, quantity : Int)叨叙,它用來產(chǎn)生新的RecipIngredient實例锭弊,隨后,構(gòu)造器將任務(wù)向上代理給父類Foodinit(name : String)擂错,這個過程滿足兩段式構(gòu)造過程的安全檢查1味滞。

RecipIngredient類也定義了一個便利構(gòu)造器init(name: String),這個便利構(gòu)造器是將任務(wù)代理給了同一個類中的指定構(gòu)造器。

注意RecipIngredient的便利構(gòu)造器init(name: String)Food中指定構(gòu)造器init(name: String)有相同的參數(shù)剑鞍,因為這個便利構(gòu)造器重寫要父類的指定構(gòu)造器init(name: String)昨凡,必須加override

以下三種方法都可以實例化RecipIngredient

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray
        
        let oneInstance = RecipIngredient()
        print(oneInstance.quantity)
        print(oneInstance.name)
        
        let twoInstance = RecipIngredient(name: "egg")
        print(twoInstance.quantity)
        print(twoInstance.name)
        
        let threeInstance = RecipIngredient(name: "egg", quantity: 10)
        print(threeInstance.quantity)
        print(threeInstance.name)

    }
}

下面看輸出結(jié)果

1
Unnamed
1
egg
10
egg

下面看最后一個類蚁署,繼承自RecipIngredient便脊,類中引入了一個布爾類型的屬性purchased,還添加了一個計算型屬性description光戈,下面看代碼哪痰。

class ShoppiingListItem: RecipIngredient {
    var purchased = false
    var description : String{
        var output = "\(quantity) x \(name)"
        output += purchased ? "買" : "不買"
        return output
    }
}

ShoppiingListItem為自己的所有屬性都提供了默認值,并且自己沒有定義任何構(gòu)造器久妆,ShoppiingListItem將自動繼承所有父類中的指定構(gòu)造器和便利構(gòu)造器晌杰。

下面看一下三個類的構(gòu)造器鏈淑履。

構(gòu)造器鏈

可以使用全部三個繼承來的構(gòu)造器創(chuàng)建ShoppiingListItem實例。

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray
        
        var breakfastList = [
            ShoppiingListItem(),
            ShoppiingListItem(name: "bread"),
            ShoppiingListItem(name: "egg", quantity: 10)
        ]
        breakfastList[0].name = "orange juice"
        breakfastList[0].purchased = true
        
        for item in breakfastList {
            print(item.description)
        }
    }
}

下面看輸出結(jié)果

1 x orange juice買
1 x bread不買
10 x egg不買

通過閉包和函數(shù)來設(shè)置屬性的默認值

如果某個存儲型屬性的默認值需要特別定制语稠,你就可以使用閉包或全局函數(shù)來為其屬性提供定制的默認值漓雅,每當這個屬性所屬的新類型實例創(chuàng)建時,對應(yīng)的閉包或者函數(shù)會被調(diào)用陶冷,而它們的返回值會當做默認值賦值給這個屬性。

這種類型的閉包或函數(shù)一般會創(chuàng)建一個跟屬性類型相同的臨時變量,然后修改它的值以滿足預(yù)期的初始狀態(tài)监右,最后將這個臨時變量的值作為屬性的默認值進行返回。

下面看一下調(diào)用格式异希。

class SomeClass{
    let someProperty : SomeType = {
        //在這個閉包中給someProperty創(chuàng)建一個默認值
        //someValue必須和SomeType類型相同
        return someValue
    }()
}

注意

  • 閉包結(jié)尾的大括號后面接一對空的小括號健盒,這是用來告訴swift需要立即執(zhí)行此閉包,如果你忽略了這對括號称簿,相當于是將閉包本身作為值賦值給了屬性扣癣,而不是將閉包的返回值賦值給屬性。
  • 如果你使用閉包來初始化屬性的值憨降,請記住在閉包執(zhí)行時父虑,實例的其他部分都還沒有初始化,這意味著你不能夠在閉包里訪問其他的屬性授药,就算這個屬性有默認值也不允許士嚎,同樣,你也不能用隱式self屬性悔叽,或者調(diào)用其他的實例方法莱衩。

看下面的結(jié)構(gòu)體定義了西洋跳棋游戲的棋盤。

棋盤

下面看一下代碼

struct Checkboard {
    let boardColors : [Bool] = {
        var temporaryBorad = [Bool]()
        var isBlack = false
        for i in 1...10{
            for j in 1...10 {
                temporaryBorad.append(isBlack)
                isBlack = !isBlack
            }
            isBlack = !isBlack
        }
        return temporaryBorad
    }()
    
    func squareIsBlackAtRow(row : Int, column : Int) -> Bool {
        return boardColors[(10 * row) + column]
    }
}

新的Checkboard實例創(chuàng)建時娇澎,對應(yīng)的賦值閉包會執(zhí)行笨蚁,一系列顏色值會被計算出來作為默認值賦值給boardColors,閉包會返回臨時數(shù)組temporaryBorad,這個返回值會被保存到boardColors中赚窃,并可以通過工具函數(shù)squareIsBlackAtRow返回册招。

下面我們就調(diào)用下看看。

class JJPracticeVC: UIViewController {

    override func viewDidLoad()
    {
        super.viewDidLoad()

        view.backgroundColor = UIColor.lightGray
        
        let checkBoard = Checkboard()
        print(checkBoard.squareIsBlackAtRow(row: 0, column: 1))
        print(checkBoard.squareIsBlackAtRow(row: 9, column: 9))
    }
}

下面看輸出結(jié)果

true
false

后記

未完勒极,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末是掰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辱匿,更是在濱河造成了極大的恐慌键痛,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匾七,死亡現(xiàn)場離奇詭異絮短,居然都是意外死亡,警方通過查閱死者的電腦和手機昨忆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門丁频,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人邑贴,你說我怎么就攤上這事席里。” “怎么了拢驾?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵奖磁,是天一觀的道長。 經(jīng)常有香客問我繁疤,道長咖为,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任稠腊,我火速辦了婚禮躁染,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘架忌。我一直安慰自己吞彤,他們只是感情好,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布鳖昌。 她就那樣靜靜地躺著备畦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪许昨。 梳的紋絲不亂的頭發(fā)上懂盐,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天,我揣著相機與錄音糕档,去河邊找鬼莉恼。 笑死拌喉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的俐银。 我是一名探鬼主播尿背,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼捶惜!你這毒婦竟也來了田藐?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吱七,失蹤者是張志新(化名)和其女友劉穎汽久,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踊餐,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡景醇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吝岭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片三痰。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖窜管,靈堂內(nèi)的尸體忽然破棺而出散劫,到底是詐尸還是另有隱情,我是刑警寧澤微峰,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布舷丹,位于F島的核電站抒钱,受9級特大地震影響蜓肆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜谋币,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一仗扬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蕾额,春花似錦早芭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至调炬,卻和暖如春语盈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缰泡。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工刀荒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓缠借,卻偏偏與公主長得像干毅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泼返,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355

推薦閱讀更多精彩內(nèi)容