亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

深入解析Swift語言編程中的可選鏈

2020-03-09 17:52:47
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了深入解析Swift語言編程中的可選鏈,是Swift入門學習中的基礎知識,需要的朋友可以參考下
 

查詢,調用屬性,下標和方法上的一個可選可能 'nil' 的過程被定義為可選的鏈??蛇x鏈返回兩個值

如果可選包含一個值,然后調用其相關屬性,方法和下標返回值

如果可選包含一個“nil”值,所有的相關屬性,方法和下標返回nil

由于多種查詢方法,屬性和下標故障組合在一起,以一種鏈將影響到整個鏈,并導致產生 'nil' 的值。

可選鏈作為一種替代強制解包裹
可選鏈與可選值后指定“?”調用一個屬性,方法或下標當可選的值返回一些值。

深入解析Swift語言編程中的可選鏈

程序用于可選鏈 '!'

復制代碼代碼如下:

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

當我們使用 playground 運行上面的程序,得到以下結果。

 

fatal error: unexpectedly found nil while unwrapping an Optional value0 swift   0x0000000103410b68 llvm::sys::PrintStackTrace(__sFILE*) + 401 swift   0x0000000103411054 SignalHandler(int) + 4522 libsystem_platform.dylib 0x00007fff9176af1a _sigtramp + 263 libsystem_platform.dylib 0x000000000000000b _sigtramp + 18544929394 libsystem_platform.dylib 0x00000001074a0214 _sigtramp + 19767836365 swift   0x0000000102a85c39 llvm::JIT::runFunction(llvm::Function*, std::__1::vector > const&) + 3296 swift   0x0000000102d320b3 llvm::ExecutionEngine::runFunctionAsMain(llvm::Function*, std::__1::vector, std::__1::allocator >, std::__1::allocator, std::__1::allocator > > > const&, char const* const*) + 15237 swift   0x000000010296e6ba swift::RunImmediately(swift::CompilerInstance&, std::__1::vector, std::__1::allocator >, std::__1::allocator, std::__1::allocator > > > const&, swift::IRGenOptions&, swift::SILOptions const&) + 10668 swift   0x000000010275764b frontend_main(llvm::ArrayRef, char const*, void*) + 52759 swift   0x0000000102754a6d main + 167710 libdyld.dylib  0x00007fff8bb9e5c9 start + 111 libdyld.dylib  0x000000000000000c start + 1950751300Stack 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” 作為類名,并包含了作為隸屬函數“candidate”。子類被聲明為 “poll booth” 和 “name” 作為被初始化為 'MP' 的隸屬度函數。對超類的調用是通過創建一個實例,“cand”可選的初始化 "!“。由于這些值在它的基類沒有聲明,“nil” 值被存儲,從而通過強制解包處理過程返回一個致命的錯誤。

程序用于可選鏈 '?'

復制代碼代碼如下:

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")
}

當我們使用 playground 運行上面的程序,得到以下結果。

 

Candidate name cannot be retreived

上述程序中聲明“ election poll” 作為類名,并包含了作為隸屬函數“candidate”。子類被聲明為 “poll booth” 和 “name” 作為被初始化為 'MP' 的隸屬度函數。對超類的調用是通過創建一個實例,“cand”可選的初始化“?”。由于基類 'nil' 的值不聲明被存儲并打印在控制臺,由其他程序塊處理。

定義模型類的可選鏈接和訪問屬性
Swift 語言還提供可選鏈的概念,聲明多個子類的模型類。這個概念將是定義復雜的模型和訪問屬性,方法和下標子屬性非常有用。

復制代碼代碼如下:

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")
}


當我們使用 playground 運行上面的程序,得到以下結果。

 

Rectangle Area is not specified

通過可選鏈調用方法

復制代碼代碼如下:

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")
}


當我們使用 playground 運行上面的程序,得到以下結果。

 

Area of circle is not specified

該函數circleprint()在circle()子類中聲明通過創建名為 “circname” 的一個實例來調用。函數會返回一個值 如果它包含一定的值則返回一些用戶定義的打印信息。否則會被檢查的語句 'if circname.print?.circleprint() != nil“

下標訪問通過可選鏈
可選鏈設置和檢索下標值以驗證是否要調用該下標返回一個值。 '?' 被放置在下標括號之前來訪問特定的標可選值。

程序 1

復制代碼代碼如下:

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.")
}


當我們使用 playground 運行上面的程序,得到以下結果。

 

Radius is not specified.

在以上程序未指定成員函數 “radiusName” 的實例值。因此,程序調用該函數將返回唯一內容,以返回必須定義特定成員函數值的一部分。

程序 2

復制代碼代碼如下:

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.")
}


當我們使用 playground 運行上面的程序,得到以下結果。

 

Radius is measured in Units.

在上面的程序被指定為成員函數 “radiusName” 的實例值。 因此,程序現在調用函數將有返回值。

可選類型訪問下標

復制代碼代碼如下:

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])


當我們使用 playground 運行上面的程序,得到以下結果。

 

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

對于下標可選的值可以通過參考其下標值來訪問。它可訪問為 subscript[0], subscript[1]等。radius 的默認值下標首先被指定為 [35,45,78,101] 和 Circle[90,45,56]。然后,下標值作為 Radius[0] 至78,以及Circle[1]?45。

鏈接鏈的多層次性
多個子類也可以憑借其超類的方法,屬性和下標通過可選鏈接聯系。

可選的多個鏈可以鏈接:

如果檢索類型是不可選的,可選鏈會返回一個可選值。例如,如果字符串通過可選鏈就會返回字符串?值

復制代碼代碼如下:

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.")
}


當我們使用 playground 運行上面的程序,得到以下結果。

 

Radius is not specified.

在以上程序未指定隸屬函數 “radiusName” 的實例值。 因此,程序調用該函數將返回唯一內容,我們必須定義返回值的特定隸屬作為函數值的一部分。

如果檢索式已經是可選的,那么可選鏈也將返回一個可選值。例如,如果字符串 ? 通過可選的鏈也將訪問返回字符串 ?值。

復制代碼代碼如下:

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.")
}


當我們使用 playground 運行上面的程序,得到以下結果。

 

Radius is measured in Units.

在上面的程序被指定為隸屬函數 “radiusName” 的實例值。因此,程序調用函數將返回值。

鏈上的方法可選返回值
可選鏈是用來定義方法來訪問子類。

復制代碼代碼如下:

 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.")
}


當我們使用 playground 運行上面的程序,得到以下結果。

 

Area of circle is not specified


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
高清欧美电影在线| 日韩激情在线视频| 色婷婷av一区二区三区久久| 午夜精品一区二区三区在线视频| 中文日韩电影网站| 国产一区二区在线播放| 国产精品一久久香蕉国产线看观看| 一本大道香蕉久在线播放29| 日韩视频永久免费观看| 美女av一区二区三区| 91精品国产综合久久久久久蜜臀| 国产精品免费小视频| 欧美极品少妇与黑人| 日韩中文视频免费在线观看| 日韩美女视频在线观看| 在线观看国产成人av片| 欧美俄罗斯性视频| 欧美视频二区36p| 国产激情久久久久| 国产精品专区h在线观看| 亚洲第一福利在线观看| 欧美日韩综合视频| 亚洲自拍偷拍一区| 欧美成人精品一区二区三区| 精品国产网站地址| 亚洲欧美另类国产| 国产精品看片资源| 日韩国产欧美区| 91精品国产91久久| 亚洲人成网站777色婷婷| 国产成人精品在线播放| 北条麻妃一区二区在线观看| 亚洲最大成人免费视频| 日韩激情在线视频| 日韩精品中文字幕在线播放| 97成人在线视频| 国产亚洲一区二区在线| 成人久久久久久| 国产日韩欧美视频| 日韩中文有码在线视频| 国产精品黄色影片导航在线观看| 成人免费在线视频网站| 国产精品午夜国产小视频| 精品亚洲一区二区三区四区五区| 51视频国产精品一区二区| 国产精品扒开腿爽爽爽视频| 亚洲裸体xxxx| 激情懂色av一区av二区av| 久久av.com| 96国产粉嫩美女| 欧美日韩福利视频| 日本一本a高清免费不卡| 国产日本欧美一区二区三区| 国产精品视频最多的网站| 国产精品6699| xxxxx91麻豆| 国产精品无av码在线观看| 成人黄色短视频在线观看| 亚洲国产私拍精品国模在线观看| 日本欧美黄网站| 国产成人精品免费久久久久| 日韩毛片中文字幕| 亚洲成人xxx| 欧美成人免费全部观看天天性色| 久久精品成人欧美大片古装| 亚洲美女在线观看| 国产精品伦子伦免费视频| 国产精品美女网站| 亚洲性69xxxbbb| 亚洲加勒比久久88色综合| 亚洲九九九在线观看| 日韩在线精品视频| www.亚洲一区| 久久国产加勒比精品无码| 中文字幕亚洲综合久久筱田步美| 日韩成人激情影院| 久久国产天堂福利天堂| 国产精品激情自拍| 97成人精品区在线播放| 欧美理论电影网| 日韩av综合网站| 亚洲精品在线视频| 欧洲美女7788成人免费视频| 日韩在线欧美在线国产在线| 日韩av一区二区在线| 成人黄色免费在线观看| 久久国产精品免费视频| 国产美女扒开尿口久久久| 国产精品视频免费在线观看| 国产乱肥老妇国产一区二| 精品国产欧美成人夜夜嗨| 中文在线资源观看视频网站免费不卡| 亚洲香蕉成人av网站在线观看| 日韩免费精品视频| 91产国在线观看动作片喷水| 国产91露脸中文字幕在线| 午夜精品久久久99热福利| 亚洲精品久久久久久久久| 黄色成人在线播放| 国产精品高清在线观看| 国产精品入口日韩视频大尺度| 日韩在线观看av| 国产91久久婷婷一区二区| 色妞久久福利网| 久久精品视频在线| 亚洲a级在线播放观看| 久久国产精品亚洲| 久久综合网hezyo| 欧美中文字幕第一页| 国产欧美一区二区三区在线看| 国内精品视频在线| 久久免费精品视频| 欧美日韩国产一区在线| 亚洲人成免费电影| 亚洲缚视频在线观看| 欧美成人激情在线| 欧美夫妻性生活xx| 69视频在线播放| 91精品国产91久久久久福利| 亚洲精品久久久久中文字幕欢迎你| 最近2019中文字幕在线高清| 国产精品美女av| 久久福利视频导航| 欧美大片免费观看| 精品国产乱码久久久久酒店| 亚洲免费视频一区二区| 亚洲免费高清视频| 久久精品这里热有精品| 亚洲第一黄色网| 亚洲三级免费看| 国产小视频国产精品| 成人性教育视频在线观看| 日本免费在线精品| 国产精品18久久久久久首页狼| 欧美成人亚洲成人日韩成人| 国产偷国产偷亚洲清高网站| 日韩亚洲欧美中文高清在线| 亚洲国产天堂网精品网站| 欧美激情在线视频二区| 亚洲国产高清自拍| 国产久一一精品| 国产精品电影在线观看| 欧美国产日本高清在线| 日韩在线观看网址| 亚洲精品成人久久久| 欧美一性一乱一交一视频| 日韩高清电影好看的电视剧电影| 欧美一级片免费在线| 国产精品视频白浆免费视频| 精品日本美女福利在线观看| 色午夜这里只有精品| 欧美性猛交丰臀xxxxx网站| 91精品视频一区| 欧美精品久久久久久久| 97国产在线视频| 亚洲人成自拍网站| 精品日本高清在线播放| 狠狠色狠狠色综合日日五| 日韩中文理论片| 亚洲香蕉av在线一区二区三区| 蜜臀久久99精品久久久无需会员| 亚洲女人天堂网| 亚洲三级黄色在线观看| 国产在线一区二区三区|