//*---------------------結構體-------------*/
//swift結構體也具有封裝的概念
//swift結構體比oc c語言裡面的結構體更加進了一步,裡面可以有方法,更接近我們的類
//結構體的定義格式 struct結構體名
struct rect {
var width:double //按構造方法賦初值
var height:double
//方法
func getheightwidth() -> (x:double,y:double)//->返回型別位元組
return(width,height)
func sumheightwidth() -> (double)
return(width+height)
//宣告結構體物件 var 變數名:結構體型別=結構體型別(引數)
//swift要求當定義乙個結構體物件的時候,必須要對裡面的變數賦乙個固定的值
//結構體的構造方法(就是建立了乙個結構體物件,首先他要分配記憶體空間(這一步由系統自行幫我們完成),分配完記憶體就會立即呼叫我們的初始化方法(構造方法)來對變數賦初值)
//swift的結構體初始化方法有兩種 一種是成員逐一構造器var rect1:rect=rect(width: 100, height: 100) 一種是系統預設的不帶任何引數的初始化方法struct rect {
//var width:double=0.0 //按構造方法賦初值
//var height:double=0.0
//var rect1:rect=rect()
var rect1:rect=rect(width: 100, height: 100)
println("\(rect1.width),\(rect1.height)")
//呼叫
var c_n=rect1.getheightwidth()
println(c_n)
var w_h=rect1.sumheightwidth()
println(w_h)
//結構體的整體賦值
var rect3 = rect1
//整體賦值後的可能性有兩種(1)rect3與rect1指向同乙個記憶體空間(2)rect3與rect1內容一樣,記憶體空間不一樣
//驗證方法有兩種可以直接列印記憶體位址還有一種是改變值如果指向統一記憶體空間則賦值後的也應該改變成一樣
rect1.width = 20
println(rect1.width)
println(rect3.width)
//值未變可以知道是第二種 即賦值後內容一樣,記憶體空間不一樣
/*----------------------類-----------------*/
//類與結構體在定義的格式上沒有太大的區別,類在建立的時候必須要給裡面的變數附乙個初始值,因為類與結構體不一樣,它沒有成員逐一構造器
class rectww {
var width:double=0.0
var height:double=0.0
var re:rectww=rectww()
println("\(re.width),\(re.height)")
//類的整體賦值
//指向同一記憶體空空間
var ss = re
re.width = 200
println(re.width)
println(ss.width)
//===恒等 !==不等 只能用類
if ss===re{
println("同乙個類")
else
println("不同")
//儲存屬性
//常量儲存屬性 :只能在構造物件的時候改變值之後不被允許改變
//延遲儲存屬性
//結構體常量和類常量與儲存屬性的關係
//結構體常量常量物件,本身是乙個常量,對應的屬性不可以通過修改它改變
struct person{
let name:nsstring = "張三"//常量
var age:int = 10//變數
let per:person=person(name: "李四", age: 20)//在構造物件的時候可以改變值之後不被允許改變 例如會報錯 = "王五" = 39
println(per.name)
//類本身是乙個常量,屬性可以通過修改它改變
class person1{
let name1:nsstring = "張三"//常量
var age1:int = 10//變數
let per1:person1=person1()//在構造物件的時候可以改變值之後不被允許改變 例如會報錯
= "王五"
per1.age1 = 39
println(per1.name1)
//延遲儲存屬性
swift語言中所有的儲存屬性都必須要有初始值,也就是當呼叫完構造方法後物件中的所有變數都應該有乙個初始值,但是延遲儲存屬性很例外,它的賦值並不都在呼叫構造方法的時候被初始化,而是在第一次被呼叫的時候初始化
struct student {
var name:string
var chinese:double
var math:double
func showmystudent(){
println("姓名:\(name),語文成績:\(chinese),數學成績:\(math)")
class myclass {
var array:[student]=
lazy var score :double = self.getscore()//延遲
func getscore()->double{
println("888888")
var t:double = 0
for i in array
t+=i.chinese
t+=i.math
if array.count == 0
return 0
else
//swif裡面只有隱式型別推斷,沒有隱式型別轉換
return t/double (array.count)
func show(){
for i in array
i.showmystudent()//直接呼叫方法
let stu1 = student(name: "張三", chinese: 100, math: 100)
let stu2 = student(name: "李四", chinese: 100, math: 100)
//建立類的物件
let c0 = myclass()
c0.show()
println(c0.getscore())
println("********")
//計算屬性
1.swift中的計算屬性不能直接儲存資料,與我們的儲存屬性不同,沒有任何的"後端儲存與之對應",簡單來說就是在對物件中各種不占用儲存空間
2.計算屬性用於計算,可以實現setter和getter兩種方法
struct myrect {
var origin:(x:double,y:double)=(0,0)//座標
var size:(w:double,h:double)=(10,10)
var center:(x:double,y:double)//中心點
//getter方法 當只有getter方法為唯讀 可以簡寫為一句return (origin.x+size.w/2,origin.y+size.h/2)
get{
return (origin.x+size.w/2,origin.y+size.h/2)
//setter方法
set(n){
//當sette沒有傳遞引數時用newvalue來代替n
origin.x=n.x-size.w/2
origin.y=n.y-size.h/2
var rect4 = myrect()
rect4.size=(100,100)
rect4.origin=(10,10)
println(rect4.center)
//屬性觀察器
//用於觀察屬性變化,是指屬性的值被修改時可以呼叫我們事先寫好的一些**段 類似oc中的kvo
//swift存在兩種屬性觀察器
在設定新值的時候被呼叫的
在新值設定之後被呼叫
//不可以給延遲屬性新增觀察器 其他的都可以
class rr {
var a:string="nihao"{
willset{
println("willset,改變之前的值:\(a)")
println(newvalue)
didset{
println("didset,改變之後的值:\(a)")
println(oldvalue)
//改變值 先建立類的物件
var ass=rr()
ass.a="hehe"
//總結 結構體為值傳遞 類為引用
Swift 類和結構體
swift 中類和結構體的共同點 1.定義屬性用於儲存值 2.定義方法用於提供功能 3.定義下標用於訪問值 4.定義構造器用於生成初始化值 5.通過擴充套件以增加預設實現的功能 6.符合協議以對某類提供標準功能 class 不同於 struct 的特點 1.允許乙個類繼承另乙個類的特徵 2.型別轉換...
Swift 類和結構體(class struct)
較傳統的oc語言,swift使用了更多的結構體 在 swift 中,所有的基本型別 整數 integer 浮點數 floating point 布林值 boolean 字串 string 陣列 array 和字典 dictionary 都是結構體型別 所以只有熟悉類和結構體各自的特性,才能編寫出更優...
Swift中類和結構體
1.類和結構體對比 swift 中類和結構體有很多共同點 與結構體相比,類還有如下的附加功能 2.類和結構體的定義語法 類和結構體有著類似的定義方式。我們通過關鍵字class和struct來分別表示類和結構體,並在一對大括號中定義它們的具體內容,如下 class videomode struct r...