//: Playground - noun: a place where people can play
import UIKit
/*swift類:Swift 類是構建代碼所用的一種通用且靈活的構造體。
?格式
?OC @interface Person : NSObject
?@end
?@impeliment
?@end
?*/
// 1.如何聲明一個類?
// 構造函數結束前必須保證所有的屬性被初始化
// 注意:在定義類的屬性時,需要給屬性一個初始化值,或者將屬性聲明成可選類型
// 如果是基本數據類型(值類型),賦值一個初始化值.如果是對象類型,那么聲明稱可選類型
//類是具有相同屬性和方法的抽象
classPerson {//基類
? ? // 類的屬性和方法
? ? varname :String=""
? ? varage :Int=0
? ? varheight :Double=0.0
? ? varbtn :UIButton?
? ? varnumberOfSlide:Int
? ? //構造器
? ? init(number:Int){
? ? ? ? print("init called")
? ? ? ? self.numberOfSlide= number
? ? }
? ? //析構器
? ? deinit {
? ? ? ? print("denied called")
? ? ? ? numberOfSlide = 0
? ? }
}
// 2.創(chuàng)建Person對象
letp :Person=Person(number:3)
p.name = "why"
p.age = 18
p.height = 1.88
p.btn = UIButton()
//1、類是引用類型, 結構體之間的賦值其實是將r2指向了r1的存儲控件, 所以他們是兩個只想同一塊存儲空間, 修改其中一個會影響到另外一個
//2、類沒有逐一構造器
//3.類與結構體的區(qū)別
///MARK: - 結構體
struct Car
{
? ? varname:String!
? ? init(name:String){
? ? ? ? self.name= name
? ? }
}
varp1 =Car(name:"bench")
varp2 =p1
p2.name = "BMW"
print(p2.name,p1.name)
/// 打印結果為BMW,bench
///MARK: - 類
class Car2
{
? ? varname:String!
? ? init(name:String){
? ? ? ? self.name= name
? ? }
}
varp12 =Car2(name:"bench")
varp22 =p12
p22.name = "BMW"
print(p12.name,p22.name)
/// 打印結果為BMW,BMW
//從上面的結果可以看出來,再次給對象賦值,結構體不會改變,而類則會改變原來的值,所以說明類的對象是引用類型,而結構體是值類型。
//還有的區(qū)別就是類是屬于面向對象編程,結構體屬于面向協(xié)議的編程,所謂面向協(xié)議編程其實就是面向對象的升級。在swift中推薦使用的是使用結構體,類在swift中不處于主流的地位,還有就是結構體也能夠實現(xiàn)類的全部功能,結構體更模塊化,默認實現(xiàn)初始化方法并且不用考慮ARC。
//結構體只需要給出變量的類型,不用給出初始值
struct car {
? ? varname:String
}
classcar2 {
? ? varname:String
? ? init(name:String) {
? ? ? ? self.name= name
? ? }
}
//如何選擇使用類還是結構體
//當賦值或者傳遞的時候更希望這些封裝的數據被賦值,而不是被引用過去
//所有被結構存儲的屬性本身也是數值類型
//結構不需要被另外一個類型繼承或者完成其它行為
//一些比較好的使用結構的例子:
//一個幾何形狀的尺寸,可能包括寬度,高度或者其它屬性,每個屬性都是Double類型的
//3D坐標系中的一個點,包括x,y和z坐標,都是Double類型
//在其它情況下(非數值情況下),類會是更好的選擇。也就是說一般情況下,自定義的一些數據結構一般都會被定義為類