Swif基本语法以及与OC比较三
(未 经 博 主 同 意,不 得 转 载 !)
//
// main.swift
// SwiftDemo3
//
// Created by lanouhn on 15/11/11.
// Copyright © 2015年 刘勇虎. All rights reserved.
// import Foundation //MARK: ---属性---
//MARK:从功能分为两种
//1.存储属性: 2.计算属性
//MARK:从调用对象分两种:
//1.类属性 2.实例属性 //1.存储属性:类似于OC中的实例变量.用来接受我们设置的属性值
class Animal {
// <#properties and methods#>
// 定义一个存储属性
var animalName :String = "小熊维尼"
// 定义可选类型
var isFly :Bool?
// lazyLoad,只有用的时候才会执行
lazy var isSpeak :Bool = true ;// lazy var isSpeak = true; 类型在赋值时可省略 } //实例化一个对象
let animal = Animal()//相当于OC中默认init ,也可以在类中重写init,调用时一般存在参数 //设置属性
animal.animalName = "跳跳虎" animal.isFly = false animal.isSpeak = true //访问属性
//print("\(animal.animalName) 说话\(animal.isSpeak) 飞\(animal.isFly)")
//print("\(animal.animalName) 说话\(animal.isSpeak) 飞\(animal.isFly!)") //MARK:2.计算属性:类似OC中的属性。(与实例变量最大区别:有set和get方法,直接访问方法 (KVC间接访问)) class Animals {
// 存储属性
var animalName :String = "拍拍熊"
// 计算属性
var aName :String{
get{ print("get") return "喜欢\(animalName)的人都有一个不同的心"//如果直接写return,而没有写set方法即代表这个属性是只读属性,在后边调用中set方法会报红
}set{
print("set")
animalName = newValue//newValue 就是我们在外边等号后想要赋上的值,
// MARK:注意 定义属性最好不要使用newXXX容易和系统重名 } }
} //实例化调用
let animal2 = Animals() animal2.animalName = "安妮熊"
//调用计算属性的get方法
//print(animal2.aName) //调用计算属性的set方法 //animal2.aName = "金克斯" //MARK:--属性观察器--
class iPhone{
//定义一个存储属性
var iPhoneType = "6sPlus"
var iPhoneColor = "RoseColor"
// 属性观察器 ,观察属性变化
var iPhonePrice :Int = {
willSet{
print("newValue = \(newValue)")
}didSet{
print("oldValue = \(oldValue)") } } } //实例化一个对象,调用set let tempiPone = iPhone() //tempiPone.iPhonePrice = 666//会调用willSet 和 didSet //(1)类 的 类属性
class Animal3 {
// 类属性只能是计算属性
class var animal3Name : String {
return "哆啦A梦"
} } //调用类属性 (直接用类调用,类似OC中类方法)
//print(Animal3.animal3Name)
//Animal3.animal3Name = "九尾"//只有return,属性为只读,不管是var、还是let修饰 //(2)结构体的类属性 关键字 static
struct Animal4 { // 类属性 计算属性
static var animal4Name :String {
return "米老鼠---米奇"
} // 类属性 存储属性
static var animal4Friend = "唐老鸭 -- 唐纳德"
} //MARK:注意-结构体的类属性不仅可以是计算属性,也可以是存储属性(类中的类属性不能是存储属性) //调用属性,直接用结构体调用 //print(Animal4.animal4Name) //Animal4.animal4Name = "唐老鸭"//只有return,属性为只读,不管是var、还是let修饰 //print(Animal4.animal4Friend) //MARK: ---属性 方法 函数 --- // 1.类方法(+)
//2.实例方法(-) class CityInfo {
var cityName = ""
var citytravelPoint = "" // 实例方法
func printCityTravelPoint(){ print("\(cityName)的景点有\(citytravelPoint)")
} // 类方法
class func printCityTravelPoint2(cityName:String,citytravelPoint:String) {
print("\(cityName)的景点有\(citytravelPoint)")
}
} //调用 let beiJing = CityInfo() beiJing.cityName = "北京"
beiJing.citytravelPoint = "天安门"
//用实例化的方法去调用实例方法
//beiJing.printCityTravelPoint()
//调用类方法(直接用类调用)
//CityInfo.printCityTravelPoint2("中关村", citytravelPoint: "Lenvo") //注意事项
struct CityInfo2 {
var cityName = "北京"
var citytravelPoint = "故宫"
// 实例方法
mutating func printCityTravelPoint(){
//MARK:注意- 结构体的方法中修改属性 ,需要在func 前用 mutating 标记 ,而类中的方法中修改属性,不需标记
self.citytravelPoint = "天坛" print("北京有\(citytravelPoint)")// print("北京有\(self.citytravelPoint)")
} //
} //调用:修改属性需要将实例变量设为var
var cityInfo2 = CityInfo2() cityInfo2.citytravelPoint = "颐和园" //cityInfo2.printCityTravelPoint() //MARK: ---类的继承---
//继承:可以使用父类属性并且实现、重写父类方法
//只有类可以,结构体是不能继承的
//如果没有明显的继承关系,那么就是继承于基类
/*MARK:注意事项---防止重写---
1.在属性或者方法名前加final关键字,那么子类能继承,不能重写
2.如果在类前加final这个类不能被继承
*/ class Zombie {
// 存储属性
var blood :Int = ;
// 计算属性 // final var name:String {//MARK:-关键字final:保护该属性或方法使得子类无法重写该方法
var name:String {
// 只读
return "普通僵尸"
}
// 实例方法
func printZombie(){
print("我是父类僵尸")
}
} // 定义僵尸的子类
class PailZombie :Zombie{
//增加属性
var tool :String = "pail"
// 增加一个新方法
func printTool(){//(1)
print("我的工具是\(self.tool)")
}
// 重写父类方法 关键字:override
override func printZombie() {//(2)
print("子类重写父类方法")
}
// 重写父类的计算属性
override var name:String{//(3)
return "我是铁桶僵尸"
}
} //实例化一个铁桶僵尸
var pailZombie = PailZombie()
pailZombie.tool = "工具是铁通"
//print(pailZombie.tool) //设置和访问父类属性
pailZombie.blood = //print("pailZonmbie的血量:\(pailZombie.blood) 名称:\(pailZombie.name)") //使用自身独有方法
//pailZombie.printTool()//(1)
//使用父类方法
//pailZombie.printZombie()//(2) //调用重写后的父类只读计算属性
//print(pailZombie.name)//(3) //MARK: ---构造方法(构造函数)---
class Food {
var foodName:String
var foodType:String
var foodPrice:Double
// 定制构造方法 set 方法
init(foodName:String , foodType:String,foodPrice:Double){
// 完成属性赋值
self.foodName = foodName
self.foodType = foodType
self.foodPrice = foodPrice
}
} //实例化一个food对象
let food = Food(foodName: "苹果", foodType: "水果", foodPrice: 2.0) //print("foodName:\(food.foodName)") //子类要继承父类
class Apple:Food{
//苹果的类型,新增属性
var appleType:String
// 重写父类构造方法
init(foodName: String, foodType: String, foodPrice: Double ,appleType:String) { // 完成属性赋值 首先给自己独有属性赋值,
self.appleType = appleType
// 直接调用父类构造方法 然后调用父类构造方法
super.init(foodName: foodName, foodType: foodType, foodPrice: foodPrice) }
} //实例化一个对象(实例化一个苹果)
let apple = Apple(foodName: "苹果", foodType:"水果" , foodPrice: 6.6, appleType: "红粉佳人") print(apple.foodName) /*总结一下
1.构造方法的安全性:
(1)构造方法完成后,创建出来的实例对象的属性必须有值
(2)当我们继承了父类的构造方法后,需要先对自身独有的属性赋值,然后在调用父类的构造方法 */ //MARK: ---内存---
//引用计数
class runSun {
//属性
var personName:String
// 构造方法
init(personName:String){
self.personName = personName
print("\(personName)变身成功")
} // 追逐太阳
func runSunAction (){
print("\(personName)正在追逐太阳!!!")
}
//MARK: 析构方法(类似OC中的dealloc)
deinit {
print("\(self.personName)扑街!!!")
}
} //创建一个追太阳的人,引用计数 + 1 (0 -> 1)
var runSunPerson :runSun? = runSun(personName: "夸父")//? 使可选,以便置为nil //再创建一个 引用计数 + 1 (1 -> 2) //MARK:注意 : --在原基础上,虚拟内存地址引用计数 +1
var runPerson :runSun? = runSunPerson //调用方法
runSunPerson!.runSunAction()//因为是可选类型需要强制转换 //释放 :引用计数 - 1 (2->1) ,内存没有释放
runSunPerson = nil //MARK:注意 : --在原基础上,虚拟内存地址引用计数 -1
//再次调用
runPerson!.runSunAction()
//释放 :引用计数 - 1 (1->0) ,内存释放
runPerson = nil //MARK: --- 总结 ---
/*野指针:指针指向无效空间 内存泄露:空间没有被释放或者没有被及时释放
1.swift使用的是引用计数管理机制。当这个对象不再使用的时候,就会执行deinit方法,销毁该空间
2.swift中当有一个指针指向该空间时,该空间就不会被释放。只有没有指针指向该空间时,这个空间才会被释放(引用计数为0)
*/ //MARK:---循环引用 weak可以破坏引用循环---
//弱引用:使指向引用计数不增加,关键字:weak 如果不写,默认strong,strong是强引用,会使得引用计数 + 1 ,weak是弱引用,引用计数不会增加 class Person {
var room :Room?
var personName:String // 构造方法
init(personName:String){ self.personName = personName
} deinit{
print("该用户扑街 !!")
} } class Room {
// 属性
var roomNumber :Int // 因为有得房间可以没有人,所以用可选类型
weak var person:Person?//不赋初值、不是可选类型或者没写初始化方法(init),会报错 弱引用:使指向引用计数不增加,关键字:weak 如果不写,默认strong,strong是强引用,会使得引用计数 + 1 ,weak是弱引用,引用计数不会增加
deinit{
print("房子被销毁 !!")
} init(roomNumber:Int){
self.roomNumber = roomNumber
}
} //实例化对象
var personItem :Person? = Person(personName: "王大锤") var roomItem :Room? = Room(roomNumber: ) //给大锤开个房 personItem!.room = roomItem //给房间设置主人
roomItem!.person = personItem personItem = nil
roomItem = nil
Swif基本语法以及与OC比较三的更多相关文章
- 黑马程序员——OC基础 三种特性之封装
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) 三种特性之一封装 (一)set方法和get方法 1) set方法 1&g ...
- Swift基本语法以及与OC的比较
一.注释: 1.单行注释和OC一致. 2.块注释中有与OC不同点:可以嵌套注释 二.常量和变量: 1.常量:初始化后可读不可写 let 2.变量:初始化后可读可写 var //不需要指定类型,系统会自 ...
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...
- 用仿ActionScript的语法来编写html5——第三篇,鼠标事件与游戏人物移动
第三篇,鼠标事件与游戏人物移动 一,假设假设,所有可添加鼠标事件的对象,都有一个mouseEvent方法,添加的鼠标事件同过这个mouseEvent来调用.这样的话,添加鼠标事件,其实只需要给canv ...
- Go语法的基本使用(三)
// 长度 vs 容量. // 长度是目前里面有几个值 // 容量是最多能放多少个值 func main(){ var a =make(chan int,4) a<-1 a<-2 a< ...
- Swift基本语法及与OC比较之二
//MARK:-----------------控制流----------------- //MARK: 1.for - in 循环 ,不用声明Value类型 //for value in 1...6 ...
- iOS开发-OC语言 (三)字符串
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; text-align: center; font: 24.0px "PingFang SC" } p ...
- OC第三天(内存管理)
内存管理: 1.作用范围: 不论什么继承了NSObject的对象,堆基本数据类型无效如:int a ,float price;;等 2.原理: 每一个对象内部都保存了一个与之相关的整数,称为引用计数器 ...
- Oracle语法 及 SQL题目(三)
目录 SQL题目六 第一个问题思路(查询酒类商品的总点击量) 第二个问题思路(查询每个类别所属商品的总点击量,并按降序排列) 第三个问题思路(查询所有类别中最热门的品种(点击量最高),并按点击量降顺序 ...
随机推荐
- 概率图模型之有向图与无向图之间的关系 I map D map perfect map(完美图) 概念
我们已经讨论了有向图和无向图框架下的概率模型,那么我们有必要讨论一下它们二者的关系.
- 非常实用的15款开源PHP类库
PHP库给开发者提供了一个标准接口,它帮助开发者在PHP里充分利用面向对象编程.这些库为特定类型的内置功能提供了一个标准的API,允许类可以与PHP引擎进行无缝的交互.此外,开发者使用这些类库还可以简 ...
- puppet&mcollective客户端安装
一.环境: 1.客户端: fedora 19 2.DnsServer: 192.168.0.160 3.server1.xxx.com(10.8.1.201):运行以下服 ...
- 驱动之路-platform简例按键驱动☆☆☆
一 .重要知识点: ▉1.platform设备模型 从Linux 2.6起引入了一套新的驱动管理和注册机制,platform_device和platform_driver,Linux中大部分的设备驱动 ...
- Java更新XML的四种常用方法简介
本文简要的讨论了Java语言编程中更新XML文档的四种常用方法,并且分析这四种方法的优劣.其次,本文还对如何控制Java程序输出的XML文档的格式做了展开论述. JAXP是Java API for X ...
- NPOI的源代码编译
打开版本库下的examples文件夹 然后打开对应的解决方案文件,尝试编译程序.发现提示缺少了dll 琢磨了半天,找到四个项目文件,打开之后进行编译.最后会生成dll到solution文件夹下的Lib ...
- poj 1062 昂贵的聘礼(最短路 dijk+枚举)
终于A 了,这题做着真麻烦 题目:http://poj.org/problem?id=1062 dijk 一般用于正权有向图 此题的关键在于等级限制的处理,最好的办法是采用枚举,即假设酋长等级为5,等 ...
- bzoj1084: [SCOI2005]最大子矩阵
dp.状态转移方程在代码里 #include<cstdio> #include<algorithm> #include<cstring> using namespa ...
- 普通方式 分页【NOT IN】和【>】效率大PK 千万级别数据测试结果
首现创建一张表,然后插入1000+万条数据,接下来进行测试. use TTgoif exists (select * from sysobjects where name='Tonge')drop t ...
- Tomcat 配置问题总结
本人是一个前端屌丝儿,最近没事研究了一下tomcat的部署问题,一下列几个实用的小技能(直接上干货了,不赘述): 1,路径引用部署 在tomcat目录下的conf/Catalina/localhost ...