本月在IOS培訓班剛畢業(yè),就出了swift 3.0 .好吧讓我這水平差的自學吧!
咱也"高大上"一回,看看官方文檔,英文看不懂啊!官方文檔地址:https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP40014097-CH13-ID82
咱有谷歌翻譯啊!我的理想就是先成為一名碼農嘛!
在結構體部分看了快2小時終于明白了,明白什么呢!
技術逼害人啊~
先來看蘋果官方文檔: ? ? ? ? ? ?(碼農們可以直接看最后圖片部分)
(谷歌翻譯的,經過多年鍛煉我已經能看懂各種中文了!)
類和結構
類和結構是通用的牙捉,即成為你的程序的代碼的積木柔性結構。您可以定義屬性和方法,通過使用完全相同的語法為常量尘吗,變量和函數(shù)將功能添加到您的類和結構慰安。
不像其他的編程語言辣卒,斯威夫特不要求你創(chuàng)建單獨的接口和實現(xiàn)文件自定義類和結構十酣。在斯威夫特灾杰,你定義一個類或單個文件的結構馅闽,外部接口到類或結構的其他代碼使用的是自動提供飘蚯。
注意
一個實例類是傳統(tǒng)上已知的作為對象。然而福也,斯威夫特類和結構在功能上比其他語言更接近聂薪,而很多本章介紹了可以應用到的實例功能惋鸥,無論是類或結構類型。正因為如此,更普通的術語實例被使用坊秸。
比較類和結構
類和結構斯威夫特有許多共同的東西。兩者都可以:
定義屬性來存儲值
限定的方法來提供功能
定義標用標語法怔接,提供訪問其值
定義初始化設置它們的初始狀態(tài)
延伸拓展其功能超出了默認的實現(xiàn)
順應協(xié)議來提供某一種標準功能
欲了解更多信息锐涯,請參見屬性,方法嗦篱,下標冰单,初始化,擴展和協(xié)議灸促。
類具有結構不附加的功能:
繼承允許一個類繼承的另一個特點诫欠。
類型轉換可以檢查并在運行時解釋一個類實例的類型。
Deinitializers使類的一個實例浴栽,以釋放它已經分配的任何資源荒叼。
引用計數(shù)允許多個參考一類實例。
欲了解更多信息典鸡,請參見繼承被廓,類型轉換,反初始化萝玷,并自動引用計數(shù)嫁乘。
注意
當他們在你的代碼通過周圍英遭,也不要使用引用計數(shù)的結構總是被復制。
定義語法
類和結構有一個類似的定義語法亦渗。你介紹類的class關鍵字和結構的struct關鍵字挖诸。無論放置一對大括號內的所有定義:
classSomeClass{
// class definition goes here
}
structSomeStructure{
// structure definition goes here
}
注意
當你定義一個新的類或結構,您可以有效地定義了一個全新的雨燕法精。給出類型UpperCamelCase名稱(如SomeClass和SomeStructure這里)來匹配標準斯威夫特類型的資本(如String多律,Int和Bool)。相反搂蜓,總是給的屬性和方法lowerCamelCase的名稱(如frameRate和incrementCount)狼荞,從類型名稱區(qū)分。
這里有一個結構定義和類定義的例子:
structResolution{
varwidth=0
varheight=0
}
classVideoMode{
varresolution=Resolution()
varinterlaced=false
varframeRate=0.0
varname:String?
}
上面的例子中定義了一個新的結構叫做Resolution帮碰,描述一個基于像素的顯示分辨率相味。這種結構叫了兩個存儲性能width和height。存儲屬性是常量或者被捆綁起來殉挽,作為類或結構的一部分存儲的變量丰涉。這兩個屬性被推斷為類型Int將它們設置為初始整數(shù)值0。
上面還的例子定義了一個名為新類VideoMode斯碌,來描述視頻顯示一個特定的視頻模式一死。這個類有四個變量存儲性能。第一傻唾,resolution被初始化一個新的Resolution結構實例投慈,其中推斷的屬性類型Resolution。對于其他三個屬性冠骄,新VideoMode實例將與被初始化interlaced設定false(意為“非隔行掃描視頻”)的再現(xiàn)幀速率0.0伪煤,和一個可選String稱為值name。在name屬性自動給出的缺省值nil凛辣,或“無name值”抱既,是因為它是一個可選的類型。
種類及結構實例
該Resolution結構定義和VideoMode類的定義只說明什么Resolution或者VideoMode看起來像蟀给。他們自己不描述具體的分辨率或視頻模式蝙砌。要做到這一點阳堕,你需要創(chuàng)建的結構或類的一個實例跋理。
創(chuàng)建實例的語法為結構和類非常相似:
letsomeResolution=Resolution()
letsomeVideoMode=VideoMode()
結構和類都使用了新的實例初始化程序語法。初始化語法最簡單的形式使用類或結構后跟空括號恬总,如的類型名稱Resolution()或VideoMode()前普。這將創(chuàng)建類或結構的新實例,與任何屬性初始化為它們的默認值壹堰。類和結構初始化中更詳細地描述初始化拭卿。
訪問屬性
您可以訪問使用實例的屬性點語法骡湖。在點語法,你實例名稱后立即寫入屬性名峻厚,用句點(分離.)响蕴,沒有任何空格:
print("The width of someResolution is\(someResolution.width)")
// Prints "The width of someResolution is 0"
在這個例子中,someResolution.width是指width的屬性someResolution惠桃,并返回其默認初始值0浦夷。
您可以深入到子屬性,如width在屬性resolution的屬性VideoMode:
print("The width of someVideoMode is\(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is 0"
您還可以使用點語法到一個新的值賦給變量屬性:
someVideoMode.resolution.width=1280
print("The width of someVideoMode is now\(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is now 1280"
注意
不同的Objective-C辜王,斯威夫特使您能夠直接設置的結構屬性的子屬性劈狐。在上面的例子,把width該財產resolution的財產someVideoMode被直接設置呐馆,沒有你需要將整個設置resolution屬性為一個新值肥缔。
按成員初始化器的結構類型
所有的結構具有自動生成的成員逐一初始化,您可以用它來初始化新的結構實例的成員屬性汹来。新實例的屬性的初始值可以被傳遞到由名成員逐一初始化:
letvga=Resolution(width:640,height:480)
不同的結構续膳,類實例沒有收到默認成員逐一初始化。初始化中更詳細地描述初始化收班。
結構和枚舉是值類型
一個值類型是一個類型姑宽,其值被復制時,它被分配給一個變量或常數(shù)闺阱,或當它被傳遞給函數(shù)炮车。
你已經使用值類型廣泛的整個前幾章實際上是。事實上酣溃,所有斯威夫特 - 整數(shù)基本類型瘦穆,浮點數(shù),布爾值赊豌,字符串扛或,數(shù)組和字典,是值類型碘饼,并作為幕后結構實現(xiàn)的熙兔。
所有的結構和枚舉是斯威夫特值類型。這意味著用戶可創(chuàng)建和任何結構和枚舉實例的任何值類型它們作為屬性艾恼,是當他們在你的代碼中傳來傳去始終復制住涉。
考慮下面這個例子,它使用了Resolution前面例子中的結構:
lethd=Resolution(width:1920,height:1080)
varcinema=hd
這個例子聲明了一個名為常量hd并將其設置為一個Resolution與(全高清視頻的寬度和高度初始化實例钠绍,1920通過像素寬1080像素高)舆声。
然后,它聲明了一個變量cinema并將其設置為當前值hd。因為Resolution是一個結構媳握,一個復制現(xiàn)有實例而成碱屁,而這個新的拷貝被分配到cinema。即使hd與cinema現(xiàn)在具有相同的寬度和高度蛾找,它們是在幕后兩個完全不同的實例娩脾。
接下來,width財產cinema被修訂為稍微增多的2K標準用于數(shù)字電影放映(寬度2048像素寬打毛,1080像素高):
cinema.width=2048
檢查width的屬性cinema表明晦雨,它確實已經更改為2048:
print("cinema is now\(cinema.width)pixels wide")
// Prints "cinema is now 2048 pixels wide"
然而,width與原始屬性hd實例仍具有的舊值1920:
print("hd is still\(hd.width)pixels wide")
// Prints "hd is still 1920 pixels wide"
當cinema被賦予的當前值hd隘冲,該值存儲在hd被復制到新的cinema實例闹瞧。最終的結果是兩個完全獨立的情況下,這正好包含相同的數(shù)值展辞。因為它們是獨立的情況下奥邮,設置的寬度cinema以2048不影響存儲在寬度hd。
同樣的行為適用于枚舉:
enumCompassPoint{
casenorth,south,east,west
}
varcurrentDirection=CompassPoint.west
letrememberedDirection=currentDirection
currentDirection= .east
ifrememberedDirection== .west{
print("The remembered direction is still .west")
}
// Prints "The remembered direction is still .west"
當rememberedDirection被分配的值currentDirection罗珍,它實際上是設置為該值的副本洽腺。改變的值currentDirection此后不會影響被存儲在所述原始值的副本rememberedDirection。
類引用類型
不像值類型覆旱,引用類型是不當它們被分配給一個變量或常數(shù)蘸朋,或當它們被傳遞給函數(shù)復制。而不是一個拷貝扣唱,為相同的現(xiàn)有實例的引用來替代藕坯。
下面是一個例子,使用VideoMode上面定義的類:
lettenEighty=VideoMode()
tenEighty.resolution=hd
tenEighty.interlaced=true
tenEighty.name="1080i"
tenEighty.frameRate=25.0
這個例子聲明一個稱為新的常數(shù)tenEighty噪沙,并將它以引用的新實例VideoMode的類炼彪。視頻模式分配的高清分辨率的副本,1920通過1080從之前正歼。它被設置為交錯辐马,并且被賦予的名稱"1080i"。最后局义,它被設置為幀速率25.0每秒幀喜爷。
接著,tenEighty被分配給一個新的常數(shù)萄唇,稱為alsoTenEighty和的幀速率alsoTenEighty被修改:
letalsoTenEighty=tenEighty
alsoTenEighty.frameRate=30.0
由于類是引用類型檩帐,tenEighty而alsoTenEighty實際上指的是同一個VideoMode實例。有效地穷绵,它們只是兩個用于同單個實例不同的名字轿塔。
檢查frameRate的財產tenEighty特愿,它可以正確地報告的新的幀速率顯示30.0從底層的VideoMode實例:
print("The frameRate property of tenEighty is now\(tenEighty.frameRate)")
// Prints "The frameRate property of tenEighty is now 30.0"
請注意仲墨,tenEighty并alsoTenEighty聲明為常量勾缭,而不是變量。但是目养,你仍然可以改變tenEighty.frameRate和alsoTenEighty.frameRate由于價值觀tenEighty和alsoTenEighty常量本身并不真正改變俩由,tenEighty而alsoTenEighty本身并沒有“商店”的VideoMode實例相反,他們都指到VideoMode幕后實例癌蚁。它是frameRate在底層的屬性VideoMode被改變幻梯,為了使恒定引用不值VideoMode。
運營商身份
因為類是參考的類型努释,它有可能為多個常量和變量來指幕后一類的相同的單一實例碘梢。(同樣是不適合的結構和枚舉真實的,因為當他們被分配到固定或可變他們總是復制或傳遞給函數(shù))伐蒂。
如果兩個常量或變量指的正是一個類的同一個實例它有時是有用的找出來煞躬。為了實現(xiàn)這一目標,雨燕提供了兩個身份運營商:
等同于(===)
不相同(!==)
使用這些運算符檢查兩個常量或變量是否指的是同一個實例:
iftenEighty===alsoTenEighty{
print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// Prints "tenEighty and alsoTenEighty refer to the same VideoMode instance."
請注意逸邦,“相同”(代表由三個等號恩沛,或===)并不意味著同樣的事情為“等于”(由兩個代表等號,或==):
“等同于”是指兩個常數(shù)或類類型的的變量是指完全相同的類的實例缕减。
“等于”是指兩個實例被認為是值“等于”或“等價物”雷客,對于“平等”的一些適當?shù)囊饬x,由該類型的設計師定義桥狡。
當你定義自己的自定義類和結構搅裙,它是你的責任,決定為兩個實例是“平等”什么資格裹芝。定義你自己的實現(xiàn)的過程“等于”和“不等于”運營商在描述對等運營商呈宇。
指針
如果你有C,C ++或Objective-C的經驗局雄,你可能知道甥啄,這些語言使用指針指到的地址在內存中。這是指一些參考類型的實例迅速常量或變量是類似于C的指針炬搭,而不是直接指向內存中的地址蜈漓,并且不需要你寫一個星號(*),以表明您創(chuàng)建參考宫盔。相反融虽,這些參考文獻中定義像夫特任何其它固定或可變。
選擇類和結構之間
您可以同時使用類和結構來定義自定義數(shù)據(jù)類型作為您的程序代碼積木使用灼芭。
然而有额,結構實例總是被傳遞價值,和類實例總是過去了參考。這意味著它們適合于不同類型的任務巍佑。當你認為你需要一個項目中的數(shù)據(jù)結構和功能茴迁,決定每一個數(shù)據(jù)結構是否應該被定義為類或結構。
作為一般原則萤衰,考慮創(chuàng)建一個結構堕义,當一個或多個條件適用:
結構的主要目的是封裝幾個比較簡單的數(shù)據(jù)值。
這是合理的預期脆栋,封裝的值將被復制倦卖,而不是當你分配或繞過該結構的一個實例引用。
由結構存儲的任何屬性本身的值類型椿争,這也將被預期要復制的怕膛,而不是被引用。
該結構不需要從其他現(xiàn)有類型繼承屬性或行為秦踪。
良好候選結構的實例包括:
幾何形狀的尺寸嘉竟,或者包封width屬性和height屬性,兩個類型的Double洋侨。
一種方法來指代范圍內的系列中舍扰,也許一個封裝start屬性和length特性,既類型Int希坚。
在三維坐標系中边苹,A點也許封裝x,y和z特性裁僧,每種類型的Double个束。
在其他情況下,定義一個類聊疲,并創(chuàng)建一個類的實例來進行管理茬底,并通過引用傳遞。在實踐中获洲,這意味著大多數(shù)自定義數(shù)據(jù)結構應該是類阱表,而不是結構。
技術逼寫了那么多代碼,一會這個值變了,一會這個值又沒變,像變戲法一樣... ...
===========================================================================
無腦碼農看這里 ?:
之前百度了各種文章,各種舉例,代碼,論證,最后無奈看了官方文檔,2個小時后我終于理解了!
如圖: