版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。
//
// main.swift
// lessonswift-03
// copyright (c) 2015年 韓俊強. all rights reserved.
import foundation
// 聲明一個類, 我們用class關鍵字修飾
// 類可以被繼承, 它是引用類型
class student {
var name = "小米"
var gender = "男"
var age = 18
}
// 建立一個student執行個體
let studnet = student()
let student2 = studnet
// 如何判斷兩個執行個體是否一樣
if studnet === student2{
println("兩個執行個體一樣, 都操作的同一塊記憶體")
}else{
println("兩個實力不一樣")
// 在類中,判斷兩個實力是否相等, 用 === ,不相等用 !==
let student3 = student()
if student3 !== studnet {
println("不一樣")
println("一樣")
// 聲明結構體我們用struct關鍵字
struct person {
var name : string
var age : int
var person = person(name: "小妹妹", age: 19)
var person2 = person
// 結構體中,不能判斷兩個執行個體是否相等
//if person === person2 {
//}
// 屬性
// 根據調用對象的不同, 屬性可以分為類屬性, 還有執行個體類型屬性
// 根據功能的不同, 屬性可以分為存儲屬性 和 計算屬性
struct animal {
// 這兩個屬性是對象來調用的, 是執行個體屬性
// 這兩個屬性是用來存儲值的, 是存儲屬性
var typename : string
var isfly : bool
// 建立一個執行個體
var dog = animal(typename: "泰迪", isfly: false)
// 該屬性的作用是存儲值, 調用的對象是執行個體
dog.typename = "藏獒"
println(dog.isfly)
class human {
var name : string!
var age : int!
// 延遲存儲屬性
// 延遲存儲屬性用lazy修飾, 而且必須是可變的, 也就是說要用var 來修飾變量, 還要給初值, 什麼時候建立, 就和我們oc中的懶加載一樣
lazy var cat : animal = animal(typename: "波斯貓", isfly: true)
let ahumen = human()
// 調用該屬性的時候, 才會被建立
ahumen.cat.typename = "加菲貓"
println(ahumen.cat.typename)
// 計算屬性
class coolperson {
// 有set get方法, 或者隻有get方法的屬性叫做計算屬性, 計算屬性不能給屬性指派, 隻能給其他屬性指派
var countproperty : string{
set {
// newvalue 就是系統在set方法中為我們提供的一個新值, 也就是我們給該屬性賦的值
println(newvalue)
name = newvalue
}
get {
// 把值給我們的計算屬性
return "\(name)" + "好帥"
}
let 小妹妹 = coolperson()
小妹妹.countproperty = "朱麗葉"
println(小妹妹.name)
println(小妹妹.countproperty)
class teacher {
var name = "小花"
var age = 19
// 隻有get方法的屬性就叫隻讀屬性, 不能給該屬性指派
var gender : string {
// get {
// return "男"
// }
// 簡潔寫法
return "男"
let 小花 = teacher()
//小花.gender = "女"
// 屬性觀察器
class bird {
var isfly : bool!
var age : int! {
willset {
// 屬性将要被指派的時候會走的方法
// newvalue 是新值
println("newvalue = \(newvalue)")
didset {
// 屬性已經被指派的時候會走該方法
println("oldvalue = \(oldvalue)")
}
}
let abird = bird()
abird.age = 19
// 類屬性
struct desk {
// 結構體中的屬性我們用static修飾
// 結構體中的類屬性, 我們要給它賦初始值
static var price : float = 2
static var numbers : int = 1
static var totalprice : float {
// newvalue 的類型和 totalprice一緻
numbers = int(newvalue)
return float(numbers) * price
// 類屬性通過類名調用
desk.numbers = 10
println("總價格 == \(desk.totalprice) 元")
// 類的類屬性
class fruit {
// 類的類屬性用class關鍵字來修飾, 并且隻能修飾計算屬性
class var name : string {
get {
return "hello"
println(fruit.name)
// 方法
// 按照調用對象的不同, 方法可以分為類方法和執行個體方法
class plane {
// 執行個體方法
func canfly() {
println("我會飛")
let plan = plane()
plan.canfly()
struct ship {
func canship() {
println("我會在水裡跑")
let ship = ship()
ship.canship()
// 類方法
struct man {
// 結構體中的類方法, 我們用static來修飾
static func playlol() {
println("男人喜歡lol")
// 通過 類名.方名 的方式調用類方法
man.playlol()
// 類中的類方法我們用class來修飾, 通過 類名.方法名 的方式來調用
class women {
class func shopping() {
println("敗家")
// 繼承
// 沒有繼承類叫基類, 也叫做超類
class yapei {
var name = "亞培"
var age = 23
var description : string {
println("\(name) 年齡 \(age) 喜歡逛淘寶")
return "\(name) 年齡 \(age) 喜歡逛淘寶"
// 如果一個類的屬性或者方法不想被繼承, 我們可以在方法或者屬性前面加關鍵字 final , 如果整個類都不想被繼承 就在 class前面加 關鍵字 final
final func infoofyapei(){
println("這是個基類的方法");
class sonofyapei: yapei {
// 不能重寫存儲屬性
// override var name = "小花"
// 我們隻能重寫計算屬性, 用override來修飾
override var description : string {
return "\(name) 的子類"
// override func infoofyapei() {
// println("重寫了父類的方法,這是子類的方法")
// }
let pei = yapei()
println(pei.description)
pei.infoofyapei()
// 構造方法
class monkey {
var gender : string
// 構造方法, 通過構造方法我們要保證每一個沒有值的屬性被指派
init(name : string,age : int,gender : string) {
// 如果屬性名和參數名一樣, 這個時候我們的屬性名前面一定要加self
// 我們要確定調用過構造方法以後, 該執行個體的每一個屬性都有值
self.name = name
self.gender = gender
self.age = age
let 孫悟空 = monkey(name: "悟空", age: 8, gender: "未知")
println((孫悟空.name,孫悟空.age,孫悟空.gender))
class 金剛 : monkey {
var hobby : string
// 必須在調用父類的構造方法前, 先給子類的沒有指派的屬性指派
init(name: string, age: int, gender: string,hobby : string) {
self.hobby = hobby
super.init(name: name, age: age, gender: gender)
let ac = 金剛 (name: "猴子`", age: 12, gender: "nan", hobby: "玩耍")
// 析構
class badegg {
var shape : string!
var color : string!
// 析構方法類似于oc裡面的dealloc 方法, 當執行個體的引用計數器為0的時候會走的方法
deinit {
println("egg --- dead")
var anegg : badegg? = badegg()
var anotheregg : badegg? = badegg()
anegg = nil
anotheregg = nil
// 自動引用計數機制
// 在swift當中也是使用自動引用計數機制來管理記憶體(arc)
// 引用技術機制僅僅應用于類的執行個體, 而結構體是值類型, 有不同的方式來存儲和傳遞值, 結構體沒有引用計數機制
// swift直接使用arc, 會在類的執行個體不再使用的時候走deinit(析構)方法
// swift中的arc機制: 這塊空間如果隻是一個指針指向, 那麼我們把這個指針置為nil, 這塊空間就會釋放掉, 如果有多個指針指向, 那麼我們需要把所有的真想這塊空間的指針置為nil,這塊空間才會釋放
原文位址:http://blog.csdn.net/qq_31810357/article/details/50081507