您的位置:首页 > 移动开发 > Swift

初探swift语言的学习笔记四(类对象,函数)

2015-09-07 14:30 357 查看
作者:fengsh998

原文地址:http://blog.csdn.net/fengsh998/article/details/29606137

转载请注明出处

如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号fengsh998来支持我,谢谢!

swift扩展了很多功能和属性,有些也比较奇P。只有慢慢学习,通过经验慢慢总结了。

下面将初步学习一下类的写法。

码工,最大爱好就是看码,而不是文字,太枯燥。

[cpp] view
plaincopy





//

// computer.swift

// swiftDemo

//

// Created by apple on 14-6-8.

// Copyright (c) 2014年 fengsh. All rights reserved.

/*

写本例子的目的在于快速学习swift类的写法,包括知识点:

1.属性设置

2.构造、释构

3.接口实现多态

4.函数的重载(重载很特别不需要overload关键词Delphi的朋友注意了)和重写(override)

5.类函数(静态成员函数)

6.各种函数的声明,带参,默认值,多个返回,多个输出参数,多个未确定参数的函数,内连函数等

7.函数类型变量,函数地址作为传参,返回函数地址(还未完工,学习中)

8.单例

9.swift新功能willset,didset @lazy 属性

10.(后续学习补充)

*/

import Foundation

var instance : Computer?

let unk = "unKnow"

//显示器屏幕宽高

struct MonitorWH {

var width = 0

var height = 0

var resolution = 0.0 //分辩率

}

//协义,接口,实现多重继承

protocol ProtocolComputer {

var price : Double {get} //只有get方法

func runComputer()

}

//计算机类型

enum ComputerType :Int

{

case none

case book //笔记本

case superBook //超级笔记本

case home //家庭电脑

}

func callbackWhenStarting()//computer:Computer

{

}

//计算机类

class Computer : NSObject,ProtocolComputer

{

var cpu = unk //cpu

var memory = unk //内存

var hardDisk = unk //硬盘

var monitor = unk //显示器

var cpName = unk //品牌

var computertype : ComputerType = .none

//@lazy //这关键词声明的有啥作用啊????

//继承接口的属性

var price :Double = 0.0

//willset didset属性

var totalPrice: Int = 0 {

willSet(newTotalPrice) { //参数使用new+变量名且变量名首地址大写

println("准备将totalPrice值(原值为:\(totalPrice))设为: \(newTotalPrice)")

//to do somthing before set.

}

didSet {

if totalPrice > oldValue {

println("设置后新值比旧值增加了\(totalPrice - oldValue)")

}

}

}

//声明一个set,get属性

var computerPrice: Double {

get {

println("you call computerPrice.")

return price

}

set {

price = newValue

println("you set computerPrice value is \(price)")

}

}

//默认构造

init()

{

println("default creatrustor is called.")

}

//默认构造 不能和init()共存

// convenience init() {

// self.init(computerName: "unknow" ,price:0)

// }

//自定义构造函数

init(computerName:String,price:Double)

{

println("custom creatrustor is called.")

self.cpName = computerName

self.price = price

}

//释构

deinit {

println("this is destory?")

}

func description() -> String

{

//还真不知道怎么换行来写代码以前可以使用\现在被作参用了

return "Computer description : product \(self.cpName) ,type is \(self.computertype.toRaw()) , cpu is \(self.cpu) ,memory is \(self.memory),disk is \(self.hardDisk) ,monitor is \(self.monitor) ,price is \(self.price)"

}

//类函数 (OC 中的+号操作, c/c++ 中的static 函数)

class func shareInstance() -> Computer

{

return Computer()

}

//开机关机 (不带返回值函数)

func operationComputer(onOrOff : Bool)

{

if onOrOff

{

println("computer is starting")

}

else

{

println("computer is stopping")

}

}

//无参,无返回值函数

func computerRunning()

{

println("computer is running")

}

//多个返回值(即输出参数)

func getComputerConfig()->(cpu:String,hd:String,mem:String,mon:String)

{

return (self.cpu,self.hardDisk,self.memory,self.monitor)

}

//使用inout参数来作为输出参数

func getComputerConfig(inout cpu:String,inout hd:String,inout mem:String,inout mon:String)

{

cpu = self.cpu

hd = self.hardDisk

mem = self.memory

mon = self.monitor

}

//外部参数名函数(目的是让调用者更加清楚每个参数的具体函义)

//computerCPU,withComputerhardDisk,withComputerMemory,withComputerMonitor 这些都是外部参数名

//在调用时必须带上

func setComputerConfig(computerCPU cpu:String,withComputerhardDisk hd:String,

withComputerMemory mem:String,withComputerMonitor mon:String)

{

self.cpu = cpu

self.hardDisk = hd

self.memory = mem

self.monitor = mon

}

//使用#来把变量名提升了具有外部参数名作用的变量名,这样就不用再写一次外部参数名(在外部参数名与变量名相同时使用)

func setComputerConfig(#cpu:String,disk:String,mem:String,mon:String)

{

self.cpu = cpu

self.hardDisk = disk

self.memory = mem

self.monitor = mon

}

//参数的默认值

func macBookPro(pname:String = "Apple",cpu:String = "Intel Core I5",type:ComputerType,

mem:String = "2G",disk:String ,mon:String = "Intel HD Graphics 4000")

{

self.cpu = cpu

self.hardDisk = disk

self.memory = mem

self.monitor = mon

self.cpName = pname

self.computertype = type

}

//可变参数

func usbNumbers(usbs:String...) -> String

{

var ret : String = ""

for usb in usbs

{

println(usb)

ret += (usb + ",")

}

return ret

}

//常量参数、变量参数

//尽管函数内部修改了version 但并不影响原来外部设定的值

func lookWindowsVersion(var version:String) ->String

{

version = "default windows " + version

return version

}

//mutating func

func getResolution(pname:String) -> MonitorWH

{

var mt = MonitorWH(width: 1364,height: 1280,resolution: 16/9)

if pname == "Phripse"

{

mt = MonitorWH(width: 5555,height: 3333,resolution: 29/10)

}

return mt

}

//函数作为参数传参

//var callbackWhenStarting : ()->() = callbackWhenStarting

//函数作为返回值

//函数作为变量定义

//嵌套函数

func openTask()

{

func openOtherTask()

{

println("open other task")

}

println("open task")

}

//函数重写

func lookComputerBasicHardInfo(computer:Computer)

{

}

//接口实现

func runComputer()

{

println("Computer run.")

}

}

class Lenove : Computer

{

override func lookComputerBasicHardInfo(computer:Computer)

{

if computer is Lenove //is as 操作。

{

println("这是联想")

}

}

}

调用DEMO:

[cpp] view
plaincopy





//var cpt = Computer() //调用默认构造

var cpt = Computer(computerName: "Apple",price:12000) //调用自定义构造

println(cpt.description)

println(cpt.getComputerConfig())

//属性测试

println("价钱为:\(cpt.computerPrice)")

cpt.computerPrice = 2000.0;

println("设置后的价钱为:\(cpt.computerPrice)")

//测试willset didset

cpt.totalPrice = 100;

cpt.totalPrice = 400;

cpt.totalPrice = 900;

var a = "",b = "",c = "",d = ""

cpt.getComputerConfig(&a,hd: &b,mem: &c,mon: &d)

println("a=\(a),b=\(b),c=\(c),d=\(d)")

cpt.setComputerConfig(computerCPU :"inter i5", withComputerhardDisk:"WD 500",

withComputerMemory:"4G",withComputerMonitor:"Phripse")

println("最新配置:\(cpt.description)")

cpt.setComputerConfig(cpu: "AMD", disk: "HD 1T", mem: "8G", mon: "SamSung")

println("最新配置:\(cpt.description)")

//使用缺省值调用函数

cpt.macBookPro(type: ComputerType.book,disk: "5")

println("平果配置:\(cpt.description)")

let usbSupportType = cpt.usbNumbers("2.0","3.0")

println("支持USB接口:\(usbSupportType))")

let extentUsbType = cpt.usbNumbers("5.0")

println("扩展USB接口:\(extentUsbType)")

var version = "xp 3";

let newversion = cpt.lookWindowsVersion(version);

println(version)

println(newversion)

输出:

[cpp] view
plaincopy





custom creatrustor is called.

Computer description : product Apple ,type is 0 , cpu is unKnow ,memory is unKnow,disk is unKnow ,monitor is unKnow ,price is 12000.0

(unKnow, unKnow, unKnow, unKnow)

you call computerPrice.

价钱为:12000.0

you set computerPrice value is 2000.0

you call computerPrice.

设置后的价钱为:2000.0

准备将totalPrice值(原值为:0)设为: 100

设置后新值比旧值增加了100

准备将totalPrice值(原值为:100)设为: 400

设置后新值比旧值增加了300

准备将totalPrice值(原值为:400)设为: 900

设置后新值比旧值增加了500

a=unKnow,b=unKnow,c=unKnow,d=unKnow

最新配置:Computer description : product Apple ,type is 0 , cpu is inter i5 ,memory is 4G,disk is WD 500 ,monitor is Phripse ,price is 2000.0

最新配置:Computer description : product Apple ,type is 0 , cpu is AMD ,memory is 8G,disk is HD 1T ,monitor is SamSung ,price is 2000.0

平果配置:Computer description : product Apple ,type is 1 , cpu is Intel Core I5 ,memory is 2G,disk is 5 ,monitor is Intel HD Graphics 4000 ,price is 2000.0

2.0

3.0

支持USB接口:2.0,3.0,)

5.0

扩展USB接口:5.0,

xp 3

default windows xp 3

this is destory?

样子最好自己写一个从过种中去学习。光看,也许还不清楚是什么。

谢谢大家,因为是英文文档,看得我头也比较痛,有些要猜和运行来理解,还有些没有完善有点乱。有些没有搞懂所以就没有整理好。

大家共同学习,共同进步。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: