欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入解析Swift語(yǔ)言編程中的可選鏈

 更新時(shí)間:2015年11月07日 15:01:48   投稿:goldensun  
這篇文章主要介紹了深入解析Swift語(yǔ)言編程中的可選鏈,是Swift入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

查詢(xún),調(diào)用屬性,下標(biāo)和方法上的一個(gè)可選可能 'nil' 的過(guò)程被定義為可選的鏈??蛇x鏈返回兩個(gè)值

如果可選包含一個(gè)值,然后調(diào)用其相關(guān)屬性,方法和下標(biāo)返回值

如果可選包含一個(gè)“nil”值,所有的相關(guān)屬性,方法和下標(biāo)返回nil

由于多種查詢(xún)方法,屬性和下標(biāo)故障組合在一起,以一種鏈將影響到整個(gè)鏈,并導(dǎo)致產(chǎn)生 'nil' 的值。

可選鏈作為一種替代強(qiáng)制解包裹
可選鏈與可選值后指定“?”調(diào)用一個(gè)屬性,方法或下標(biāo)當(dāng)可選的值返回一些值。

2015117145605093.png (718×113)

程序用于可選鏈 '!'

復(fù)制代碼 代碼如下:

class ElectionPoll {
   var candidate: Pollbooth?
}
class Pollbooth {  
   var name = "MP"
}
 
let cand = ElectionPoll()
  
let candname = cand.candidate!.name

當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。

fatal error: unexpectedly found nil while unwrapping an Optional value
0 swift   0x0000000103410b68 llvm::sys::PrintStackTrace(__sFILE*) + 40
1 swift   0x0000000103411054 SignalHandler(int) + 452
2 libsystem_platform.dylib 0x00007fff9176af1a _sigtramp + 26
3 libsystem_platform.dylib 0x000000000000000b _sigtramp + 1854492939
4 libsystem_platform.dylib 0x00000001074a0214 _sigtramp + 1976783636
5 swift   0x0000000102a85c39 llvm::JIT::runFunction(llvm::Function*, std::__1::vector > const&) + 329
6 swift   0x0000000102d320b3 llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*, std::__1::vector, std::__1::allocator >, std::__1::allocator, std::__1::allocator > > > const&, char const* const*) + 1523
7 swift   0x000000010296e6ba swift::RunImmediately(swift::CompilerInstance&, std::__1::vector, std::__1::allocator >, std::__1::allocator, std::__1::allocator > > > const&, swift::IRGenOptions&, swift::SILOptions const&) + 1066
8 swift   0x000000010275764b frontend_main(llvm::ArrayRef, char const*, void*) + 5275
9 swift   0x0000000102754a6d main + 1677
10 libdyld.dylib  0x00007fff8bb9e5c9 start + 1
11 libdyld.dylib  0x000000000000000c start + 1950751300
Stack dump:
0. Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -interpret - -target x86_64-apple-darwin14.0.0 -target-cpu core2 -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk -module-name main 
/bin/sh: line 47: 15672 Done   cat <<'SWIFT'
import Foundation

上述程序中聲明“ election poll” 作為類(lèi)名,并包含了作為隸屬函數(shù)“candidate”。子類(lèi)被聲明為 “poll booth” 和 “name” 作為被初始化為 'MP' 的隸屬度函數(shù)。對(duì)超類(lèi)的調(diào)用是通過(guò)創(chuàng)建一個(gè)實(shí)例,“cand”可選的初始化 "!“。由于這些值在它的基類(lèi)沒(méi)有聲明,“nil” 值被存儲(chǔ),從而通過(guò)強(qiáng)制解包處理過(guò)程返回一個(gè)致命的錯(cuò)誤。

程序用于可選鏈 '?'

復(fù)制代碼 代碼如下:

class ElectionPoll {
   var candidate: Pollbooth?
}
class Pollbooth {
   var name = "MP"
}
  
let cand = ElectionPoll()
  
if let candname = cand.candidate?.name {
   println("Candidate name is \(candname)")
}
else {
   println("Candidate name cannot be retreived")
}

當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。

Candidate name cannot be retreived

上述程序中聲明“ election poll” 作為類(lèi)名,并包含了作為隸屬函數(shù)“candidate”。子類(lèi)被聲明為 “poll booth” 和 “name” 作為被初始化為 'MP' 的隸屬度函數(shù)。對(duì)超類(lèi)的調(diào)用是通過(guò)創(chuàng)建一個(gè)實(shí)例,“cand”可選的初始化“?”。由于基類(lèi) 'nil' 的值不聲明被存儲(chǔ)并打印在控制臺(tái),由其他程序塊處理。

定義模型類(lèi)的可選鏈接和訪問(wèn)屬性
Swift 語(yǔ)言還提供可選鏈的概念,聲明多個(gè)子類(lèi)的模型類(lèi)。這個(gè)概念將是定義復(fù)雜的模型和訪問(wèn)屬性,方法和下標(biāo)子屬性非常有用。

復(fù)制代碼 代碼如下:

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
  
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      println("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}

class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var street: String?
  
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let rectname = rectangle()

if let rectarea = rectname.print?.cprint {
   println("Area of rectangle is \(rectarea)")
}  else {
   println("Rectangle Area is not specified")
}


當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。

Rectangle Area is not specified



通過(guò)可選鏈調(diào)用方法

復(fù)制代碼 代碼如下:

class rectangle {
   var print: circle?
}
class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
  
   func circleprint() {
      println("Area of Circle is: \(cprint)")
   }
   var rectarea: circumference?
}

class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
  
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let circname = rectangle()

if circname.print?.circleprint() != nil {
   println("Area of circle is specified)")
} else {
   println("Area of circle is not specified")
}


當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。

Area of circle is not specified

該函數(shù)circleprint()在circle()子類(lèi)中聲明通過(guò)創(chuàng)建名為 “circname” 的一個(gè)實(shí)例來(lái)調(diào)用。函數(shù)會(huì)返回一個(gè)值 如果它包含一定的值則返回一些用戶(hù)定義的打印信息。否則會(huì)被檢查的語(yǔ)句 'if circname.print?.circleprint() != nil“

下標(biāo)訪問(wèn)通過(guò)可選鏈
可選鏈設(shè)置和檢索下標(biāo)值以驗(yàn)證是否要調(diào)用該下標(biāo)返回一個(gè)值。 '?' 被放置在下標(biāo)括號(hào)之前來(lái)訪問(wèn)特定的標(biāo)可選值。

程序 1

復(fù)制代碼 代碼如下:

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
  
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
     
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      println("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}


class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
  
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}


let circname = rectangle()

if let radiusName = circname.print?[0].radiusname {
   println("The first room name is \(radiusName).")
} else {
   println("Radius is not specified.")
}


當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。

Radius is not specified.

在以上程序未指定成員函數(shù) “radiusName” 的實(shí)例值。因此,程序調(diào)用該函數(shù)將返回唯一內(nèi)容,以返回必須定義特定成員函數(shù)值的一部分。

程序 2

復(fù)制代碼 代碼如下:

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
  
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      println("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}

class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
  
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let circname = rectangle()
circname.print?[0] = radius(radiusname: "Diameter")

let printing = circle()
printing.area.append(radius(radiusname: "Units"))
printing.area.append(radius(radiusname: "Meter"))
circname.print = printing

if let radiusName = circname.print?[0].radiusname {
   println("Radius is measured in \(radiusName).")
} else {
   println("Radius is not specified.")
}


當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。

Radius is measured in Units.

在上面的程序被指定為成員函數(shù) “radiusName” 的實(shí)例值。 因此,程序現(xiàn)在調(diào)用函數(shù)將有返回值。

可選類(lèi)型訪問(wèn)下標(biāo)

復(fù)制代碼 代碼如下:

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
  
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
  
   func circleprint() {
      println("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}


class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
  
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let circname = rectangle()
circname.print?[0] = radius(radiusname: "Diameter")

let printing = circle()
printing.area.append(radius(radiusname: "Units"))
printing.area.append(radius(radiusname: "Meter"))
circname.print = printing

var area = ["Radius": [35, 45, 78, 101], "Circle": [90, 45, 56]]
area["Radius"]?[1] = 78
area["Circle"]?[1]--

println(area["Radius"]?[0])
println(area["Radius"]?[1])
println(area["Radius"]?[2])
println(area["Radius"]?[3])


println(area["Circle"]?[0])
println(area["Circle"]?[1])
println(area["Circle"]?[2])


當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。

Optional(35)
Optional(78)
Optional(78)
Optional(101)
Optional(90)
Optional(44)
Optional(56)

對(duì)于下標(biāo)可選的值可以通過(guò)參考其下標(biāo)值來(lái)訪問(wèn)。它可訪問(wèn)為 subscript[0], subscript[1]等。radius 的默認(rèn)值下標(biāo)首先被指定為 [35,45,78,101] 和 Circle[90,45,56]。然后,下標(biāo)值作為 Radius[0] 至78,以及Circle[1]〜45。

鏈接鏈的多層次性
多個(gè)子類(lèi)也可以憑借其超類(lèi)的方法,屬性和下標(biāo)通過(guò)可選鏈接聯(lián)系。

可選的多個(gè)鏈可以鏈接:

如果檢索類(lèi)型是不可選的,可選鏈會(huì)返回一個(gè)可選值。例如,如果字符串通過(guò)可選鏈就會(huì)返回字符串?值

復(fù)制代碼 代碼如下:

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      println("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}


class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
  
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}


let circname = rectangle()

if let radiusName = circname.print?[0].radiusname {
   println("The first room name is \(radiusName).")
} else {
   println("Radius is not specified.")
}


當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。

Radius is not specified.

在以上程序未指定隸屬函數(shù) “radiusName” 的實(shí)例值。 因此,程序調(diào)用該函數(shù)將返回唯一內(nèi)容,我們必須定義返回值的特定隸屬作為函數(shù)值的一部分。

如果檢索式已經(jīng)是可選的,那么可選鏈也將返回一個(gè)可選值。例如,如果字符串 ? 通過(guò)可選的鏈也將訪問(wèn)返回字符串 ?值。

復(fù)制代碼 代碼如下:

class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      println("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}


class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
  
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}


let circname = rectangle()

if let radiusName = circname.print?[0].radiusname {
   println("The first room name is \(radiusName).")
} else {
   println("Radius is not specified.")
}


當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。

Radius is measured in Units.

在上面的程序被指定為隸屬函數(shù) “radiusName” 的實(shí)例值。因此,程序調(diào)用函數(shù)將返回值。

鏈上的方法可選返回值
可選鏈?zhǔn)怯脕?lái)定義方法來(lái)訪問(wèn)子類(lèi)。

復(fù)制代碼 代碼如下:

 class rectangle {
   var print: circle?
}

class circle {
   var area = [radius]()
   var cprint: Int {
      return area.count
   }
  
   subscript(i: Int) -> radius {
      get {
         return area[i]
      }
      set {
         area[i] = newValue
      }
   }
   func circleprint() {
      println("The number of rooms is \(cprint)")
   }
   var rectarea: circumference?
}

class radius {
   let radiusname: String
   init(radiusname: String) { self.radiusname = radiusname }
}

class circumference {
   var circumName: String?
   var circumNumber: String?
   var circumarea: String?
  
   func buildingIdentifier() -> String? {
      if circumName != nil {
         return circumName
      } else if circumNumber != nil {
         return circumNumber
      } else {
         return nil
      }
   }
}

let circname = rectangle()
circname.print?[0] = radius(radiusname: "Diameter")

let printing = circle()
printing.area.append(radius(radiusname: "Units"))
printing.area.append(radius(radiusname: "Meter"))
circname.print = printing

if let radiusName = circname.print?[0].radiusname {
   println("Radius is measured in \(radiusName).")
} else {
   println("Radius is not specified.")
}


當(dāng)我們使用 playground 運(yùn)行上面的程序,得到以下結(jié)果。

Area of circle is not specified

相關(guān)文章

  • Swift踩坑實(shí)戰(zhàn)之一個(gè)字符引發(fā)的Crash

    Swift踩坑實(shí)戰(zhàn)之一個(gè)字符引發(fā)的Crash

    swift通常都是通過(guò)對(duì)應(yīng)的signal來(lái)捕獲crash,下面這篇文章主要給大家介紹了關(guān)于Swift踩坑實(shí)戰(zhàn)之一個(gè)字符引發(fā)的Crash的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02
  • swift相冊(cè)相機(jī)的權(quán)限處理示例詳解

    swift相冊(cè)相機(jī)的權(quán)限處理示例詳解

    在iOS7以后要打開(kāi)手機(jī)攝像頭或者相冊(cè)的話(huà)都需要權(quán)限,在iOS9中更是更新了相冊(cè)相關(guān)api的調(diào)用,那么下面這篇文章主要給大家介紹了關(guān)于swift相冊(cè)相機(jī)權(quán)限處理的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下。
    2017-10-10
  • Objective-C和Swift的轉(zhuǎn)換速查手冊(cè)(推薦)

    Objective-C和Swift的轉(zhuǎn)換速查手冊(cè)(推薦)

    這篇文章主要給大家介紹了關(guān)于Objective-C和Swift的轉(zhuǎn)換速查手冊(cè)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),非常推薦給大家參考學(xué)習(xí)使用,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)不
    2018-06-06
  • Swift中的限定擴(kuò)展詳析

    Swift中的限定擴(kuò)展詳析

    擴(kuò)展就是向一個(gè)已有的類(lèi)、結(jié)構(gòu)體或枚舉類(lèi)型添加新功能。下面這篇文章主要給大家介紹了關(guān)于Swift中限定擴(kuò)展的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2018-03-03
  • 舉例講解Swift編程中switch...case語(yǔ)句的用法

    舉例講解Swift編程中switch...case語(yǔ)句的用法

    這篇文章主要介紹了Swift編程中switch...case語(yǔ)句的用法,其中fallthrough關(guān)鍵字在switch語(yǔ)句中的使用是重點(diǎn),需要的朋友可以參考下
    2016-04-04
  • 在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法

    在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼混合編程的方法

    這篇文章主要介紹了在一個(gè)項(xiàng)目中同時(shí)使用Swift和Objective-C代碼的方法,在一個(gè)工程中同時(shí)使用Swift和Objective-C混合語(yǔ)言編程的方法,需要的朋友可以參考下
    2014-07-07
  • Swift中圖片資源使用流程的優(yōu)化方法詳解

    Swift中圖片資源使用流程的優(yōu)化方法詳解

    這篇文章主要給大家介紹了關(guān)于Swift中圖片資源使用流程的優(yōu)化方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Swift編程中實(shí)現(xiàn)希爾排序算法的代碼實(shí)例

    Swift編程中實(shí)現(xiàn)希爾排序算法的代碼實(shí)例

    希爾排序是對(duì)插入排序的一種改進(jìn)版本,算法本身并不穩(wěn)定,存在優(yōu)化空間,這里我們來(lái)講一下希爾排序的大體思路及Swift編程中實(shí)現(xiàn)希爾排序算法的代碼實(shí)例
    2016-07-07
  • 深入講解C語(yǔ)言編程中volatile修飾符的作用

    深入講解C語(yǔ)言編程中volatile修飾符的作用

    這篇文章主要介紹了C語(yǔ)言編程中volatile修飾符的作用,文章深入到內(nèi)存優(yōu)化方面進(jìn)行解析,非常推薦!需要的朋友可以參考下
    2015-11-11
  • 如何刪掉編程中的?Switch?語(yǔ)句

    如何刪掉編程中的?Switch?語(yǔ)句

    多重方法是一種有趣的方式,可以幫你擺脫令人討厭的?switch,這篇文章主要介紹了如何刪掉編程中的?Switch?語(yǔ)句,需要的朋友可以參考下
    2022-09-09

最新評(píng)論