麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Swift > 正文

Swift 3.0基礎學習之類與結構體

2020-03-09 17:46:17
字體:
供稿:網(wǎng)友

前言

和其他語言不同的是,Swift不需要為自定義的類和結構體創(chuàng)建接口和實現(xiàn)文件。只需要創(chuàng)建單一文件用來創(chuàng)建類和結構體,其他的外部接口的代碼系統(tǒng)會自動生成。下面這篇文章主要介紹了關于Swift 3.0類與結構體的內(nèi)容,感興趣的朋友一起來看看吧。

類和結構體區(qū)別

Swift的類和結構體具有以下相同的特點:

  • 可以定義屬性來保存值
  • 可以定義方法來提供功能
  • 可以定義下標來使用他們的值
  • 可以定義初始化器來配置他們的初始化狀態(tài)
  • 可以在默認的實現(xiàn)上擴展他們的功能
  • 遵從協(xié)議來提供標準的功能

類具有結構體沒有的額外的功能:

  • 繼承允許某一個類繼承另外一個類的特性
  • 類型轉(zhuǎn)換允許你檢查并在運行時解釋一個類實例的類型
  • 析構器允許釋放所有該類已經(jīng)賦值的實例資源
  • 引用計數(shù)允許多個引用一個類的實例

結構體一般來說賦值的時候是直接拷貝的,沒有使用引用計數(shù)的機制。

符號定義

下面是一個定義結構體和類的例子:

struct Resolution { var width = 0 var height = 0}class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String?}

結構體初始化的時候可以直接

let vga = Resolution(width: 640, height: 480)

這點和類不一樣,類沒有默認的逐個成員的初始化器。

結構體和枚舉是值類型

let hd = Resolution(width: 1920, height: 1080)var cinema = hd

再賦值

cinema.width = 2048

結果

print("cinema is now /(cinema.width) pixels wide")// Prints "cinema is now 2048 pixels wide"

然而hd.width還是1920

print("hd is still /(hd.width) pixels wide")// Prints "hd is still 1920 pixels wide"

可見賦值過程是做了一次深度拷貝。

枚舉也是具有同樣的行為, 如以下例子,rememberedDirection的值并沒有改變:

enum CompassPoint { case north, south, east, west}var currentDirection = CompassPoint.westlet rememberedDirection = currentDirectioncurrentDirection = .eastif rememberedDirection == .west { print("The remembered direction is still .west")}// Prints "The remembered direction is still .west"

類是引用類型

例如:

let tenEighty = VideoMode()tenEighty.resolution = hdtenEighty.interlaced = truetenEighty.name = "1080i"tenEighty.frameRate = 25.0

進行賦值引用

let alsoTenEighty = tenEightyalsoTenEighty.frameRate = 30.0

結果

print("The frameRate property of tenEighty is now /(tenEighty.frameRate)")// Prints "The frameRate property of tenEighty is now 30.0"

標識符

  • 完全相同(===)
  • 不完全相同(!===)
if tenEighty === alsoTenEighty { print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")}// Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."

完全相同(===)和等于(==)是不一樣的:

  • 完全相同意思是兩個類類型的常量或者變量指向完全相同的類實例
  • 等于意思是兩個實例被認為值相同或者相等, 可以自行定義==操作符來進行判斷兩個實例在某種意義上是相等的

選擇使用類和結構體

由于結構體的實例一般是值傳遞,而類實例一般是引用傳遞,因此你需要根據(jù)實際情況來考慮應該定義一個類還是結構體.

如有以下一種或多仲情況使用結構體:

  • 結構體主要的目的是封裝少量的相關性簡單數(shù)據(jù)值
  • 在結構體的實例賦值或者傳遞的時候,需要考慮到封裝好的值會被拷貝而不是引用是否是合理的
  • 任何保存于結構體的屬性都是值類型的,他們也是期望被賦值或者傳遞時是拷貝而不是引用
  • 結構體不需要從其他存在的類型繼承屬性或者行為

看看幾個使用結構體恰當?shù)睦樱?/p>

  • 幾何圖形的大小,可以封裝width和height屬性,都是Double類型
  • 指向連續(xù)序列范圍的方法,可以封裝start和length屬性,都是Int類型
  • 一個在3D坐標系統(tǒng)的點, 可以封裝x, y和z屬性,都是Double類型

其他的情況請定義類并創(chuàng)建類實例,管理和傳遞都使用引用。

在實踐中,大部分的自定義數(shù)據(jù)結構都是使用類居多,很少使用結構體。

String、Array和Dictionary的賦值和拷貝行為

String, Array和 Dictionary都是結構體,因此賦值直接是拷貝,而NSString, NSArray 和NSDictionary則是類,所以是使用引用的方式。

參考英語原文:
https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID82

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關教程知識閱讀請移步到swift教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产精品99久久免费观看 | 日韩黄网站 | 中国av一级片 | 密室逃脱第一季免费观看完整在线 | 久久色伦理资源站 | 成年片在线观看 | 欧美成人亚洲 | 成人三级在线播放 | 国产青草网| 国产精品一区免费在线观看 | 欧美999| 51国产偷自视频区视频小蝌蚪 | 日韩美香港a一级毛片 | 看免费黄色一级片 | 狠狠干91 | 国产日韩大片 | 深夜免费福利视频 | 成人福利在线免费观看 | 羞羞的网址 | 日韩在线播放中文字幕 | 91系列在线观看 | 欧美黄色免费视频 | 一级做人爱c黑人影片 | 色中色综合| 九九色在线观看 | 久色porn| 欧美一级成人一区二区三区 | 毛片免费观看视频 | 久久久一区二区 | 国内毛片视频 | www.99热视频 | 爽毛片| 久久青草影院 | 特级黄色影院 | 女教师~淫辱の动漫在线 | 欧美一级毛片免费观看视频 | 日本在线观看一区二区 | 国产一区二区不卡 | 操碰视频在线观看 | 手机国产乱子伦精品视频 | 午夜亚洲视频 |