Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等
写了12个Person来复习,不过完成同样的代码需要敲键盘的次数相比OC确实少了很多,这很多应该归功于Swift中不写分号,以及少了OC中的中括号。
一、类与结构体
两者在Swift中差不了多少了
类与结构体有很多相同的地方: (第2,3点是其他语言中不存在的)
1)都可以定义属性/方法/下标(结构体也可以定义方法了)
2)都能初始化(通过构造方法)
3)都能使用扩展(extension)与协议(protocol)
4)类与结构体(枚举)中的全局属性/方法:在类中用class关键字,但在结构体中用static
类比结构体多的功能:
1)能继承
2)运行时能检查类对象的类型
3)析构释放资源
4)引用计数允许一个类实例有多个引用
- class Person1{
- var name = "jack"
- // class var height:Int = 10 //错误! 类中不能有全局存储属性的, 只能是计算属性. 见下文说明
- }
- struct Person2{ //结构体更像Java中的类
- var age:Int
- // static var height:Int = 10 //可以设定全局属性, 需要初始化.
- }
- //1.1实例化类与结构, 默认构造器
- let p1 = Person1()
- let p2 = Person2(age: 10) //当使用默认构造器时, 必须初始化里面所有的属性
二、属性(存储属性--计算属性--类属性)
2.1存储属性: 就是存储一个常量或变量,类似Java中的成员变量
- class Person3{
- var name:String = "xuneng" //需要手动初始化
- var age:Int = 10
- let height = 175
- lazy var p1:Person1 = Person1() //延迟, 必须是var
- }
- var p3 = Person3()
- p3.name //通过点语法来访问
- p3.age = 11 //设置
- //延迟lazy存储属性: 当使用改属性时才进行初始化, 好处是避免空间浪费
- println(p3.p1) //这句调用时, p1才进行初始化
2.2计算属性: 不直接存储值,而是用get/set来做.可用来操作其他属性值的变化
get: 取, 用来封装取值的过程
set: 设, 用来封装设值的过程
- class Person4{
- var name:String = "jack"
- var jjLength:Int = 10
- var age:Int{ //只能是var
- get{
- return jjLength * 2
- }
- set(newAge){
- jjLength = newAge / 2
- }
- }
- }
- var p4 = Person4()
- p4.age = 10 //当设age为10时,jjLength变为5
2.2.1 简便的计算属性写法
- //默认参数newValue, 表示新赋给的值
- class Person5{
- //用newValue
- var jjLength:Int = 10
- var age:Int{ //只能是var
- get{
- return jjLength * 2
- }
- set{
- jjLength = newValue / 2
- }
- }
- //只读计算属性
- var height:Int{
- get{
- return jjLength * 4
- }
- }
- var height2:Int{ //只读直接可以省略get
- return jjLength * 4
- }
- }
- var p5 = Person5()
- p5.height
- //p5.height = 10 //只读的不能赋值
2.2.2 注意计算属性的死循环情况
计算属性的值是不固定的,因此不能用let修饰,只能用var
计算属性不能直接赋值
- class Person6{
- //用newValue
- var jjLength:Int = 10
- // var height2:Int = 10{ //不能直接赋值, 否则成存储属性了
- // return jjLength * 4
- // }
- var age:Int{
- get{
- return age //死循环. age会调用get方法
- }
- set{
- age = newValue //死循环. age设值时会调用set方法
- }
- }
- }
2.3 类属性(或者叫做类型属性)用class关键字修饰.类属性只能是计算属性.
类属性就是类似java中static修饰的属性.一个类只有一份,且多个实例对象共享.可直接用类名调用
- class Person7{
- class var name:String{
- return "xuneng"
- }
- }
- Person7.name
2.4 属性监视器: 可用来监视属性变化的2个方法willSet, didSet
计算属性因为有get和set方法,因此监视器其实对计算属性没多大用处.对存储属性用处大
初始化值时, 不会调用willSet与didSet
willSet, didSet和set, get不能共存
- class Person8{
- var name:String = "xuneng"{
- willSet{
- println("新值为:\(newValue)") //newValue新值
- }
- didSet{
- println("新值为:\(oldValue)") //oldValue表示旧值
- }
- }
- }
- var p8 = Person8()
- p8.name = "jack" //这句调用
三、函数与方法
3.1 对象方法
类中的方法与函数的一点区别: 方法的第一个参数以后,全是外部参数.名字即为参数名
- class Person9{
- func sum(num1:Int , num2:Int){
- println(num1 + num2)
- }
- }
- var p9 = Person9()
- p9.sum(10, num2: 10) //第一个参数以后, 全是外部参数. 相当于加了#
3.2 类方法. 用class修饰
- class Person10{
- class func sum(num1:Int , num2:Int){
- println(num1 + num2)
- }
- }
- Person10.sum(10, num2: 10)
3.3 self与super, 与OC相同
- class Person11{
- func sum(num1:Int , num2:Int){
- self.fun() //对象方法调用对象方法, 类方法调用类方法
- }
- func fun(){
- println("hello")
- }
- }
四、下标(附属脚本)
下标, 有的叫附属脚本(subscript), 新东西。
可以定义在 类/结构体/枚举中,进行快速访问。
- //格式:也可以设定set/get
- /*
- subscript(index:Int) -> Int{
- get{
- }
- set{
- }
- }
- */
- struct Person12{ //官方很多用的结构体
- let jjLength:Int //结构体在这里可以不初始化
- subscript(index:Int) -> Int{
- return jjLength * index
- }
- }
- var p12 = Person12(jjLength: 10)
- p12[3] //直接像访问数组一样访问. 根据jj长度,index为3,值为30
示例代码见:http://github.com/xn4545945/SwiftLearning
参考:
The Swift Programming Language
Apple Dev Center
转载请注明出处:http://blog.csdn.net/xn4545945
Swift类与结构、存储属性、计算属性、函数与方法、附属脚本等的更多相关文章
- Swift-存储属性,计算属性,类属性
//类的属性定义 class Student: NSObject { // 定义属性 // 定义存储属性 var age : Int = var name :String? var mathScore ...
- swift 类 与 结构体
这两天突然有人问我 swift里面 类和 结构体 有什么区别? 说实在的本人目前不太看好swift,相信很多人也是,oc 都 很成熟了. 本人目前不打算深入了解swift的原因swift 语言 ...
- Swift类和结构体
在C++中,相信不会有太多人去详细考究结构体和类的区别,因为二者关系实在不大.但在Swift中,结构体和类的关系非常大,它们的组成部分都包括:初始化器.实例方法.实例属性.类型属性.类型方法等等:二者 ...
- Python中类的声明,使用,属性,实例属性,计算属性及继承,重写
Python中的类的定义以及使用: 类的定义: 定义类 在Python中,类的定义使用class关键字来实现 语法如下: class className: "类的注释" 类的实体 ...
- Swift类与结构体
类和结构体有很多共性: 定义属性存储数据 定义方法执行功能处理 定义下标,通过下标访问他们的值 初始化他们的状态 通过扩展(Extension)扩展其功能 遵守协议(Protocol),协议提供一种特 ...
- Swift: 类与结构体
对比类与结构体 类与结构体有许多的相同点,它们都可以: 定义属性来存储值: 定义方法来提供功能: 定义下标操作: 定义初始化函数: 扩展它的默认的实现: 遵从协议: 类有一些额外的能力,但是结构体没有 ...
- Swift类和结构体定义-备
Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { 定义类的成员 } struct 结构体名 { ...
- Swift类和结构
类和结构有非常多的共同点: 定义属性存储数据 定义方法执行功能处理 定义下标,通过下标訪问他们的值 初始化他们的状态 通过扩展(Extension)扩展其功能 遵守协议(Protocol).协议提供一 ...
- swift 类和结构体
1:类和结构体定义 类和结构体分别通过关键字class 和struct定义. swift的编码风格是类class和结构体struct名字使用大写字母开头的匈牙利表示法,相反的.类的方法和属性则用小写字 ...
随机推荐
- PHP - 多维数组
多维数组指的是包含一个或多个数组的数组. PHP 能理解两.三.四或五级甚至更多级的多维数组.不过,超过三级深的数组对于大多数人难于管理. 注释:数组的维度指示您需要选择元素的索引数. 对于二维数组, ...
- Unity 鼠标点击左右移动,人物跟随旋转
上代码: using UnityEngine; using System.Collections; public class Test : MonoBehaviour { private Vector ...
- Unity3d修炼之路:载入一个预制体,然后为该对象加入组件,然后查找对象,得到组件。
#pragma strict function Awake(){ //载入一个预制体 资源必须在 Resources目录下 Resources.LoadLoad(); //载入后 必须演示样例化 Ga ...
- Sql Server使用正则表达式
近日因项目需求,需要在sql server中用到正则表达式,因Sql Server本身并不支持正则表达式,需要用到Clr函数. 在此记录一下步骤,与大家共享,虽然写的是原创,但有参考网上的文章. 1. ...
- LR实战之Discuz开源论坛——网页细分图结果分析(Web Page Diagnostics)
续LR实战之Discuz开源论坛项目,之前一直是创建虚拟用户脚本(Virtual User Generator)和场景(Controller),现在,终于到了LoadRunner性能测试结果分析(An ...
- 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵
偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...
- Java使用默认浏览器打开指定URL
直接贴代码: 方法一: Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler http://www.baidu.co ...
- javascript XMLHttpRequest对象全面剖析
转载:http://www.jb51.net/article/23175.htm 一. 引言 异步JavaScript与XML(AJAX)是一个专用术语,用于实现在客户端脚本与服务器之间的数据交互过程 ...
- SQL语言学习-数据操纵语言
一般而言,数据库中数据的生命周期包括数据插入以及更新.数据删除3个阶段.首先需要用户或者系统将数据插入表.然后,对数据的使用,包括数据的检索以及数据的更新.最后,如果数据已经没有使用价值,则将数据删除 ...
- hibernate报错:org.hibernate.MappingException: No Dialect mapping for JDBC type: -1
解决方法:自定义一个Hibernate Dialect. package com.yourcompany.util ; import java.sql.Types; import org.hibern ...