iOS 學(xué)習(xí) Swift 教程- 2.17 可選鏈?zhǔn)秸{(diào)用

前言:
本篇文章的目的期虾,在于記錄學(xué)習(xí)過程,敦促自己,方便查看惠呼。

練習(xí)工具:Playground
學(xué)習(xí)網(wǎng)站: swift51

本頁包含內(nèi)容:

可選鏈?zhǔn)秸{(diào)用是一種可以在當(dāng)前值可能為nil的可選值上請求和調(diào)用屬性怕品、方法及下標(biāo)的方法槐雾。如果可選值有值,那么調(diào)用就會成功若河;如果可選值是nil能岩,那么調(diào)用將返回nil。多個(gè)調(diào)用可以連接在一起形成一個(gè)調(diào)用鏈萧福,如果其中任何一個(gè)節(jié)點(diǎn)為nil拉鹃,整個(gè)調(diào)用鏈都會失敗,即返回nil鲫忍。

注意
Swift 的可選鏈?zhǔn)秸{(diào)用和 Objective-C 中向nil發(fā)送消息有些相像膏燕,但是 Swift 的可選鏈?zhǔn)秸{(diào)用可以應(yīng)用于任意類型,并且能檢查調(diào)用是否成功悟民。

使用可選鏈?zhǔn)秸{(diào)用代替強(qiáng)制展開

通過在想調(diào)用的屬性坝辫、方法、或下標(biāo)的可選值后面放一個(gè)問號(?)射亏,可以定義一個(gè)可選鏈近忙。這一點(diǎn)很像在可選值后面放一個(gè)嘆號(!)來強(qiáng)制展開它的值竭业。它們的主要區(qū)別在于當(dāng)可選值為空時(shí)可選鏈?zhǔn)秸{(diào)用只會調(diào)用失敗,然而強(qiáng)制展開將會觸發(fā)運(yùn)行時(shí)錯(cuò)誤及舍。

為了反映可選鏈?zhǔn)秸{(diào)用可以在空值(nil)上調(diào)用的事實(shí)永品,不論這個(gè)調(diào)用的屬性、方法及下標(biāo)返回的值是不是可選值击纬,它的返回結(jié)果都是一個(gè)可選值鼎姐。你可以利用這個(gè)返回值來判斷你的可選鏈?zhǔn)秸{(diào)用是否調(diào)用成功,如果調(diào)用有返回值則說明調(diào)用成功更振,返回nil則說明調(diào)用失敗炕桨。

特別地,可選鏈?zhǔn)秸{(diào)用的返回結(jié)果與原本的返回結(jié)果具有相同的類型肯腕,但是被包裝成了一個(gè)可選值献宫。例如,使用可選鏈?zhǔn)秸{(diào)用訪問屬性实撒,當(dāng)可選鏈?zhǔn)秸{(diào)用成功時(shí)姊途,如果屬性原本的返回結(jié)果是Int類型,則會變?yōu)镮nt?類型知态。

下面幾段代碼將解釋可選鏈?zhǔn)秸{(diào)用和強(qiáng)制展開的不同捷兰。

首先定義兩個(gè)類Person和Residence (翻譯“住宅”):

 class Person {
     var residence: Residence?
 }
 
 class Residence {
     var numberOfRooms = 1
 }

Residence有一個(gè)Int類型的屬性numberOfRooms,其默認(rèn)值為1负敏。Person具有一個(gè)可選的residence屬性贡茅,其類型為Residence?。

假如你創(chuàng)建了一個(gè)新的Person實(shí)例,它的residence屬性由于是是可選型而將初始化為nil,在下面的代碼中,john有一個(gè)值為nil的residence屬性:

 let john = Person()

如果使用嘆號(!)強(qiáng)制展開獲得這個(gè)john的residence屬性中的numberOfRooms值其做,會觸發(fā)運(yùn)行時(shí)錯(cuò)誤顶考,因?yàn)檫@時(shí)residence沒有可以展開的值:

 let roomCount = john.residence!.numberOfRooms
 // 這會引發(fā)運(yùn)行時(shí)錯(cuò)誤

john.residence為非nil值的時(shí)候,上面的調(diào)用會成功妖泄,并且把roomCount設(shè)置為Int類型的房間數(shù)量驹沿。正如上面提到的,當(dāng)residence為nil的時(shí)候上面這段代碼會觸發(fā)運(yùn)行時(shí)錯(cuò)誤蹈胡。

可選鏈?zhǔn)秸{(diào)用提供了另一種訪問numberOfRooms的方式渊季,使用問號(?)來替代原來的嘆號(!)

   if let roomCount = john.residence?.numberOfRooms {
      print("John's residence has \(roomCount) room(s).")
  } else {
      print("Unable to retrieve the number of rooms.")
  }
  // 打印 “Unable to retrieve the number of rooms.”

在residence后面添加問號之后,Swift 就會在residence不為nil的情況下訪問numberOfRooms审残。

因?yàn)樵L問numberOfRooms有可能失敗梭域,可選鏈?zhǔn)秸{(diào)用會返回Int?類型,或稱為“可選的 Int”搅轿。如上例所示病涨,當(dāng)residence為nil的時(shí)候,可選的Int將會為nil璧坟,表明無法訪問numberOfRooms既穆。訪問成功時(shí)赎懦,可選的Int值會通過可選綁定展開,并賦值給非可選類型的roomCount常量幻工。

要注意的是励两,即使numberOfRooms是非可選的Int時(shí),這一點(diǎn)也成立囊颅。只要使用可選鏈?zhǔn)秸{(diào)用就意味著numberOfRooms會返回一個(gè)Int?而不是Int当悔。

可以將一個(gè)Residence的實(shí)例賦給john.residence,這樣它就不再是nil了:

 john.residence = Residence()

john.residence現(xiàn)在包含一個(gè)實(shí)際的Residence實(shí)例踢代,而不再是nil盲憎。如果你試圖使用先前的可選鏈?zhǔn)秸{(diào)用訪問numberOfRooms,它現(xiàn)在將返回值為1的Int?類型的值:

 if let roomCount = john.residence?.numberOfRooms {
     print("John's residence has \(roomCount) room(s).")
 } else {
     print("Unable to retrieve the number of rooms.")
 }
 // 打印 “John's residence has 1 room(s).”

為可選鏈?zhǔn)秸{(diào)用定義模型類

通過使用可選鏈?zhǔn)秸{(diào)用可以調(diào)用多層屬性胳挎、方法和下標(biāo)饼疙。這樣可以在復(fù)雜的模型中向下訪問各種子屬性,并且判斷能否訪問子屬性的屬性慕爬、方法或下標(biāo)窑眯。

下面這段代碼定義了四個(gè)模型類,這些例子包括多層可選鏈?zhǔn)秸{(diào)用医窿。為了方便說明磅甩,在Person和Residence的基礎(chǔ)上增加了Room類和Address類,以及相關(guān)的屬性留搔、方法以及下標(biāo)更胖。

Person類的定義基本保持不變:

 class Person {
     var residence: Residence?
 }

Residence類比之前復(fù)雜些,增加了一個(gè)名為rooms的變量屬性隔显,該屬性被初始化為[Room]類型的空數(shù)組:

 class Residence {
     var rooms = [Room]()
     var numberOfRooms: Int {
         return rooms.count
     }
     subscript(i: Int) -> Room {
         get {
             return rooms[i]
         }
         set {
             rooms[i] = newValue
         }
     }
     func printNumberOfRooms() {
         print("The number of rooms is \(numberOfRooms)")
     }
     var address: Address?
 }

現(xiàn)在Residence有了一個(gè)存儲Room實(shí)例的數(shù)組,numberOfRooms屬性被實(shí)現(xiàn)為計(jì)算型屬性饵逐,而不是存儲型屬性括眠。numberOfRooms屬性簡單地返回rooms數(shù)組的count屬性的值。

Residence還提供了訪問rooms數(shù)組的快捷方式倍权,即提供可讀寫的下標(biāo)來訪問rooms數(shù)組中指定位置的元素掷豺。

此外,Residence還提供了printNumberOfRooms方法薄声,這個(gè)方法的作用是打印numberOfRooms的值当船。

最后,Residence還定義了一個(gè)可選屬性address默辨,其類型為Address?德频。Address類的定義在下面會說明。

 class Room {
     let name: String
     init(name: String) { self.name = name }
 }

最后一個(gè)類是Address缩幸,這個(gè)類有三個(gè)String?類型的可選屬性壹置。buildingName以及buildingNumber屬性分別表示某個(gè)大廈的名稱和號碼竞思,第三個(gè)屬性street表示大廈所在街道的名稱:

 class Address {
    var buildingName: String?
     var buildingNumber: String?
     var street: String?
     func buildingIdentifier() -> String? {
         if buildingName != nil {
             return buildingName
         } else if buildingNumber != nil && street != nil {
             return "\(buildingNumber ?? "XXX") \(street ?? "XX")"
         } else {
             return nil
         }
     }
 }

Address類提供了buildingIdentifier()方法,返回值為String?钞护。 如果buildingName有值則返回buildingName盖喷。或者难咕,如果buildingNumber和street均有值則返回buildingNumber课梳。否則,返回nil余佃。

通過可選鏈?zhǔn)秸{(diào)用訪問屬性

正如使用可選鏈?zhǔn)秸{(diào)用代替強(qiáng)制展開中所述暮刃,可以通過可選鏈?zhǔn)秸{(diào)用在一個(gè)可選值上訪問它的屬性,并判斷訪問是否成功咙冗。

下面的代碼創(chuàng)建了一個(gè)Person實(shí)例沾歪,然后像之前一樣,嘗試訪問numberOfRooms屬性:

 let john = Person()
 if let roomCount = john.residence?.numberOfRooms {
     print("John's residence has \(roomCount) room(s).")
 } else {
     print("Unable to retrieve the number of rooms.")
 }
 // 打印 “Unable to retrieve the number of rooms.”

因?yàn)閖ohn.residence為nil雾消,所以這個(gè)可選鏈?zhǔn)秸{(diào)用依舊會像先前一樣失敗灾搏。

還可以通過可選鏈?zhǔn)秸{(diào)用來設(shè)置屬性值:

 let someAddress = Address()
 someAddress.buildingNumber = "29"
 someAddress.street = "Acacia Road"
 john.residence?.address = someAddress

在這個(gè)例子中,通過john.residence來設(shè)定address屬性也會失敗立润,因?yàn)閖ohn.residence當(dāng)前為nil狂窑。

上面代碼中的賦值過程是可選鏈?zhǔn)秸{(diào)用的一部分,這意味著可選鏈?zhǔn)秸{(diào)用失敗時(shí)桑腮,等號右側(cè)的代碼不會被執(zhí)行莺琳。對于上面的代碼來說,很難驗(yàn)證這一點(diǎn)革半,因?yàn)橄襁@樣賦值一個(gè)常量沒有任何副作用尔苦。下面的代碼完成了同樣的事情,但是它使用一個(gè)函數(shù)來創(chuàng)建Address實(shí)例提陶,然后將該實(shí)例返回用于賦值烫沙。該函數(shù)會在返回前打印“Function was called”,這使你能驗(yàn)證等號右側(cè)的代碼是否被執(zhí)行隙笆。

 func createAddress() -> Address {
     print("Function was called.")
 
     let someAddress = Address()
     someAddress.buildingNumber = "29"
     someAddress.street = "Acacia Road"
 
     return someAddress
 }
 john.residence?.address = createAddress()

沒有任何打印消息锌蓄,可以看出createAddress()函數(shù)并未被執(zhí)行。

通過可選鏈?zhǔn)秸{(diào)用調(diào)用方法

可以通過可選鏈?zhǔn)秸{(diào)用來調(diào)用方法撑柔,并判斷是否調(diào)用成功瘸爽,即使這個(gè)方法沒有返回值。

Residence類中的printNumberOfRooms()方法打印當(dāng)前的numberOfRooms值铅忿,如下所示:

 func printNumberOfRooms() {
     print("The number of rooms is \(numberOfRooms)")
 }

這個(gè)方法沒有返回值剪决。然而,沒有返回值的方法具有隱式的返回類型Void,如無返回值函數(shù)中所述昼捍。這意味著沒有返回值的方法也會返回()识虚,或者說空的元組。

如果在可選值上通過可選鏈?zhǔn)秸{(diào)用來調(diào)用這個(gè)方法妒茬,該方法的返回類型會是Void?担锤,而不是Void,因?yàn)橥ㄟ^可選鏈?zhǔn)秸{(diào)用得到的返回值都是可選的乍钻。這樣我們就可以使用if語句來判斷能否成功調(diào)用printNumberOfRooms()方法肛循,即使方法本身沒有定義返回值。通過判斷返回值是否為nil可以判斷調(diào)用是否成功:

 if john.residence?.printNumberOfRooms() != nil {
     print("It was possible to print the number of rooms.")
 } else {
     print("It was not possible to print the number of rooms.")
 }
 // 打印 “It was not possible to print the number of rooms.”

同樣的银择,可以據(jù)此判斷通過可選鏈?zhǔn)秸{(diào)用為屬性賦值是否成功多糠。在上面的通過可選鏈?zhǔn)秸{(diào)用訪問屬性的例子中,我們嘗試給john.residence中的address屬性賦值浩考,即使residencenil夹孔。通過可選鏈?zhǔn)秸{(diào)用給屬性賦值會返回Void?,通過判斷返回值是否為nil就可以知道賦值是否成功:

 if (john.residence?.address = someAddress) != nil {
     print("It was possible to set the address.")
 } else {
     print("It was not possible to set the address.")
 }
 // 打印 “It was not possible to set the address.”

通過可選鏈?zhǔn)秸{(diào)用訪問下標(biāo)

通過可選鏈?zhǔn)秸{(diào)用析孽,我們可以在一個(gè)可選值上訪問下標(biāo)搭伤,并且判斷下標(biāo)調(diào)用是否成功。

注意
通過可選鏈?zhǔn)秸{(diào)用訪問可選值的下標(biāo)時(shí)袜瞬,應(yīng)該將問號放在下標(biāo)方括號的前面而不是后面怜俐。可選鏈?zhǔn)秸{(diào)用的問號一般直接跟在可選表達(dá)式的后面邓尤。

下面這個(gè)例子用下標(biāo)訪問john.residence屬性存儲的Residence實(shí)例的rooms數(shù)組中的第一個(gè)房間的名稱拍鲤,因?yàn)閖ohn.residence為nil,所以下標(biāo)調(diào)用失敗了:

 if let firstRoomName = john.residence?[0].name {
     print("The first room name is \(firstRoomName).")
 } else {
     print("Unable to retrieve the first room name.")
 }
 // 打印 “Unable to retrieve the first room name.”

在這個(gè)例子中汞扎,問號直接放在john.residence的后面季稳,并且在方括號的前面,因?yàn)閖ohn.residence是可選值澈魄。

類似的绞幌,可以通過下標(biāo),用可選鏈?zhǔn)秸{(diào)用來賦值:

john.residence?[0] = Room(name: "Bathroom")

這次賦值同樣會失敗一忱,因?yàn)閞esidence目前是nil。

如果你創(chuàng)建一個(gè)Residence實(shí)例谭确,并為其rooms數(shù)組添加一些Room實(shí)例帘营,然后將Residence實(shí)例賦值給john.residence,那就可以通過可選鏈和下標(biāo)來訪問數(shù)組中的元素:

 let johnsHouse = Residence()
johnsHouse.rooms.append(Room(name: "Living Room"))
johnsHouse.rooms.append(Room(name: "Kitchen"))
john.residence = johnsHouse

if let firstRoomName = john.residence?[0].name {
    print("The first room name is \(firstRoomName).")
} else {
    print("Unable to retrieve the first room name.")
}
// 打印 “The first room name is Living Room.”

訪問可選類型的下標(biāo)

如果下標(biāo)返回可選類型值逐哈,比如 Swift 中Dictionary類型的鍵的下標(biāo)芬迄,可以在下標(biāo)的結(jié)尾括號后面放一個(gè)問號來在其可選返回值上進(jìn)行可選鏈?zhǔn)秸{(diào)用:

 var testScores = ["Dave": [86, 82, 84], "Bev": [79, 94, 81]]
 testScores["Dave"]?[0] = 91
 testScores["Bev"]?[0] += 1
 testScores["Brian"]?[0] = 72
 // "Dave" 數(shù)組現(xiàn)在是 [91, 82, 84],"Bev" 數(shù)組現(xiàn)在是 [80, 94, 81]

上面的例子中定義了一個(gè)testScores數(shù)組昂秃,包含了兩個(gè)鍵值對禀梳,把String類型的鍵映射到一個(gè)Int值的數(shù)組杜窄。這個(gè)例子用可選鏈?zhǔn)秸{(diào)用把"Dave"數(shù)組中第一個(gè)元素設(shè)為91,把"Bev"數(shù)組的第一個(gè)元素+1算途,然后嘗試把"Brian"數(shù)組中的第一個(gè)元素設(shè)為72塞耕。前兩個(gè)調(diào)用成功,因?yàn)閠estScores字典中包含"Dave"和"Bev"這兩個(gè)鍵嘴瓤。但是testScores字典中沒有"Brian"這個(gè)鍵扫外,所以第三個(gè)調(diào)用失敗。

連接多層可選鏈?zhǔn)秸{(diào)用

可以通過連接多個(gè)可選鏈?zhǔn)秸{(diào)用在更深的模型層級中訪問屬性廓脆、方法以及下標(biāo)筛谚。然而,多層可選鏈?zhǔn)秸{(diào)用不會增加返回值的可選層級停忿。

也就是說:

  • 如果你訪問的值不是可選的驾讲,可選鏈?zhǔn)秸{(diào)用將會返回可選值。
  • 如果你訪問的值就是可選的席赂,可選鏈?zhǔn)秸{(diào)用不會讓可選返回值變得“更可選”吮铭。

因此:

  • 通過可選鏈?zhǔn)秸{(diào)用訪問一個(gè)Int值,將會返回Int?氧枣,無論使用了多少層可選鏈?zhǔn)秸{(diào)用沐兵。
  • 類似的,通過可選鏈?zhǔn)秸{(diào)用訪問Int?值便监,依舊會返回Int?值扎谎,并不會返回Int??。

下面的例子嘗試訪問john中的residence屬性中的address屬性中的street屬性烧董。這里使用了兩層可選鏈?zhǔn)秸{(diào)用毁靶,residence以及address都是可選值:

 if let johnsStreet = john.residence?.address?.street {
     print("John's street name is \(johnsStreet).")
 } else {
     print("Unable to retrieve the address.")
 }
 // 打印 “Unable to retrieve the address.”

john.residence現(xiàn)在包含一個(gè)有效的Residence實(shí)例。然而逊移,john.residence.address的值當(dāng)前為nil预吆。因此,調(diào)用john.residence?.address?.street會失敗胳泉。

需要注意的是拐叉,上面的例子中,street的屬性為String?扇商。john.residence?.address?.street的返回值也依然是String?凤瘦,即使已經(jīng)使用了兩層可選鏈?zhǔn)秸{(diào)用。

如果為john.residence.address賦值一個(gè)Address實(shí)例案铺,并且為address中的street屬性設(shè)置一個(gè)有效值蔬芥,我們就能過通過可選鏈?zhǔn)秸{(diào)用來訪問street屬性:

 let johnsAddress = Address()
johnsAddress.buildingName = "The Larches"
johnsAddress.street = "Laurel Street"
john.residence?.address = johnsAddress

if let johnsStreet = john.residence?.address?.street {
    print("John's street name is \(johnsStreet).")
} else {
    print("Unable to retrieve the address.")
}
// 打印 “John's street name is Laurel Street.”

在上面的例子中,因?yàn)閖ohn.residence包含一個(gè)有效的Address實(shí)例,所以對john.residence的address屬性賦值將會成功笔诵。

在方法的可選返回值上進(jìn)行可選鏈?zhǔn)秸{(diào)用

上面的例子展示了如何在一個(gè)可選值上通過可選鏈?zhǔn)秸{(diào)用來獲取它的屬性值返吻。我們還可以在一個(gè)可選值上通過可選鏈?zhǔn)秸{(diào)用來調(diào)用方法,并且可以根據(jù)需要繼續(xù)在方法的可選返回值上進(jìn)行可選鏈?zhǔn)秸{(diào)用乎婿。

在下面的例子中测僵,通過可選鏈?zhǔn)秸{(diào)用來調(diào)用Address的buildingIdentifier()方法。這個(gè)方法返回String?類型的值次酌。如上所述恨课,通過可選鏈?zhǔn)秸{(diào)用來調(diào)用該方法,最終的返回值依舊會是String?類型:

 if let buildingIdentifier = john.residence?.address?.buildingIdentifier() {
     print("John's building identifier is \(buildingIdentifier).")
 }
 // 打印 “John's building identifier is The Larches.”

如果要在該方法的返回值上進(jìn)行可選鏈?zhǔn)秸{(diào)用岳服,在方法的圓括號后面加上問號即可:

 if let beginsWithThe =
     john.residence?.address?.buildingIdentifier()?.hasPrefix("The") {
         if beginsWithThe {
             print("John's building identifier begins with \"The\".")
         } else {
             print("John's building identifier does not begin with \"The\".")
         }
 }
 // 打印 “John's building identifier begins with "The".”

注意
在上面的例子中剂公,在方法的圓括號后面加上問號是因?yàn)槟阋赽uildingIdentifier()方法的可選返回值上進(jìn)行可選鏈?zhǔn)秸{(diào)用,而不是方法本身吊宋。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纲辽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子璃搜,更是在濱河造成了極大的恐慌拖吼,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件这吻,死亡現(xiàn)場離奇詭異吊档,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)唾糯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門怠硼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人移怯,你說我怎么就攤上這事香璃。” “怎么了舟误?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵葡秒,是天一觀的道長。 經(jīng)常有香客問我嵌溢,道長眯牧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任赖草,我火速辦了婚禮炸站,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疚顷。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布腿堤。 她就那樣靜靜地躺著阀坏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪笆檀。 梳的紋絲不亂的頭發(fā)上忌堂,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天,我揣著相機(jī)與錄音酗洒,去河邊找鬼士修。 笑死,一個(gè)胖子當(dāng)著我的面吹牛樱衷,可吹牛的內(nèi)容都是我干的棋嘲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼矩桂,長吁一口氣:“原來是場噩夢啊……” “哼沸移!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侄榴,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雹锣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后癞蚕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蕊爵,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年桦山,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了攒射。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡度苔,死狀恐怖匆篓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情寇窑,我是刑警寧澤鸦概,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站甩骏,受9級特大地震影響窗市,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饮笛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一咨察、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧福青,春花似錦摄狱、人聲如沸脓诡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽祝谚。三九已至,卻和暖如春酣衷,著一層夾襖步出監(jiān)牢的瞬間交惯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工穿仪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留席爽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓啊片,卻偏偏與公主長得像只锻,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子钠龙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

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