详解Swift编程中的方法与属性的概念

方法
在 Swift 中特定类型的相关联功能被称为方法。在 Objective C 中类是用来定义方法,其中作为 Swift 语言为用户提供了灵活性,类,结构和枚举中可以定义使用方法。

实例方法
在 Swift 语言,类,结构和枚举实例通过实例方法访问。

  • 实例方法提供的功能
  • 访问和修改实例属性
  • 函数关联实例的需要

实例方法可以写在花括号 {} 内。它隐含的访问方法和类实例的属性。当该类型指定具体实例它调用获得访问该特定实例。

语法

代码如下:

func funcname(Parameters)-> returntype
{Statement1Statement2---Statement N
    return parameters
}

示例

代码如下:

class calculations {let a:Intlet b:Intlet res:Int
   
    init(a:Int, b:Int){self.a = a
        self.b = b
        res = a + b
    }
   
    func tot(c:Int)->Int{return res - c
    }
   
    func result(){
        println("Result is: \(tot(20))")
        println("Result is: \(tot(50))")}}let pri = calculations(a:600, b:300)
pri.result()

当我们使用 playground 运行上面的程序,得到以下结果

Result is: 880
Result is: 850

Calculations 类定义了两个实例方法:

init() 被定义为两个数 a 和 b 相加,并将其结果存储在'res'

tot() 用于通过从 “res” 值减去 'c'

最后,调用打印的计算a和b的值方法. 实例方法以 "." 语法访问

局部和外部参数名称
Swift 函数描述了局部和全局变量声明。同样,Swift 方法的命名规则也类似 Objective C。但是局部和全局参数名称声明的特性对于函数和方法不同。 swift 第一个参数是由介词名称'with', 'for' 和 'by' 访问命名规则。

Swift 提供声明作为局数参数名称,其它参数名称为全局参数名,第一参数是方法名称。在这里,“no1”方法作为局部参数名来声明。 'no2' 用于全局声明,并通过该程序访问。

代码如下:

class division {var count:Int=0
    func incrementBy(no1:Int, no2:Int){
        count = no1 / no2
        println(count)}}let counter = division()
counter.incrementBy(1800, no2:3)
counter.incrementBy(1600, no2:5)
counter.incrementBy(11000, no2:3)

当我们使用 playground 运行上面的程序,得到以下结果

600
320
3666

外部参数名称使用 # 和 _ 符号
尽管 Swift 方法提供第一个参数名称作为局部声明,用户必须提供以修改参数名称从局部到全局声明。这可以通过'#'符号前缀使用第一参数名来完成。通过这样做,第一参数可以作为全局在整个模块访问。

当用户需要使用外部名称访问在后面的参数名中,方法的名字使用“_”符号覆盖。

代码如下:

class multiplication {var count:Int=0
    func incrementBy(#no1:Int, no2:Int){
        count = no1 * no2
        println(count)}}let counter = multiplication()
counter.incrementBy(no1:800, no2:3)
counter.incrementBy(no1:100, no2:5)
counter.incrementBy(no1:15000, no2:3)

当我们使用 playground 运行上面的程序,得到以下结果

2400
500
45000

在方法中的Self属性
方法有一个隐式属性被称为“self”,所有定义的类型实例所都有。“self”属性被用于表示当前的实例定义的方法。

代码如下:

class calculations {let a:Intlet b:Intlet res:Int
   
    init(a:Int, b:Int){self.a = a
        self.b = b
        res = a + b
        println("Inside Self Block: \(res)")}
   
    func tot(c:Int)->Int{return res - c
    }
   
    func result(){
        println("Result is: \(tot(20))")
        println("Result is: \(tot(50))")}}let pri = calculations(a:600, b:300)let sum = calculations(a:1200, b:300)

pri.result()
sum.result()

当我们使用 playground 运行上面的程序,得到以下结果

Inside Self Block: 900
Inside Self Block: 1500
Result is: 880
Result is: 850
Result is: 1480
Result is: 1450

修改的实例方法值类型
在 Swift 语言结构和枚举和值类型不能由它的实例方法来改变。然而,swift 语言通过“变异”行为提供了灵活修改值类型。突变将使得在实例方法中的任何变化,将方法执行之后变化返回到原来的形式。此外,由 “selft” 属性的新实例其隐式函数创建,执行之后将取代现有的方法

代码如下:

struct area {var length =1var breadth =1
   
    func area()->Int{return length * breadth
    }
   
    mutating func scaleBy(res:Int){
        length *= res
        breadth *= res
       
        println(length)
        println(breadth)}}var val = area(length:3, breadth:5)
val.scaleBy(3)
val.scaleBy(30)
val.scaleBy(300)

当我们使用 playground 运行上面的程序,得到以下结果

9
15
270
450
81000
135000

Self 属性的不同诱变方法
突变方法结合 “self” 属性分配给新实例所定义的方法。

代码如下:

struct area {var length =1var breadth =1
   
    func area()->Int{return length * breadth
    }
   
    mutating func scaleBy(res:Int){self.length *= res
        self.breadth *= res
        println(length)
        println(breadth)}}var val = area(length:3, breadth:5)
val.scaleBy(13)

当我们使用 playground 运行上面的程序,得到以下结果

39
65

类型方法
当方法的特定实例调用,它调用一个实例方法并且当方法调用特定类型的方法的一个被定义为 "类型方法“。类型方法 “类” 是由“func”关键字和结构定义,和枚举型方法使用 “func” 关键字之前的“static”关键字定义。

类型方法调用,是通过访问 '.' 而不是调用特定实例的方法,例子和语法如下:

代码如下:

classMath{class func abs(number:Int)->Int{if number <0{return(-number)}else{return number
        }}}struct absno
{static func abs(number:Int)->Int{if number <0{return(-number)}else{return number
        }}}letno=Math.abs(-35)let num = absno.abs(-5)

println(no)
println(num)

当我们使用 playground 运行上面的程序,得到以下结果

35
5

属性
Swift 语言提供了类,枚举或结构相关联值的属性。属性可以被进一步分为存储属性和计算属性。

存储性能和计算属性的区别

这两种存储和计算属性与实例类型相关联。当属性与它的类型值相关联,那么它定义为“类型属性”。存储和计算的属性通常与一个特定类型的实例相关联。然而,属性也可以与类型本身相关联。这样的属性是已知的类型的属性。 属性观察者也被使用

观察存储的属性值

观察子类从父继承而得的属性

存储属性
Swift 介绍存储的属性概念用来存储常量和变量的实例。常量存储的属性由 'let' 关键字定义和存储变量的属性由 “var” 关键字定义。

在定义存储的属性提供了“默认值”

在初始化期间用户可以初始化和修改初始值

代码如下:

structNumber{var digits:Intlet pi =3.1415}var n =Number(digits:12345)
n.digits =67

println("\(n.digits)")
println("\(n.pi)")

当我们使用 playground 运行上面的程序,得到以下结果

67
3.1415

考虑在上面的代码,如下面的一行:

代码如下:

let pi = 3.1415

这里,可变圆周率被初始化为存储属性值使用所述实例 pi = 3.1415. 所以,每当实例被称为将持有单独的值是:3.1415。

另一种方法,已存储的属性可能常量结构。这样结构的整个实例将被认为是“常量属性的存储”。

代码如下:

structNumber{var digits:Intlet numbers =3.1415}var n =Number(digits:12345)
n.digits =67

println("\(n.digits)")
println("\(n.numbers)")
n.numbers =8.7

当我们使用 playground 运行上面的程序,得到以下结果

error: cannot assign to 'numbers' in 'n'
n.numbers = 8.7

重新初始化'数字'为8.7,它将返回指示“数字''被声明为常数的错误消息。

懒存储属性
Swift 提供了所谓的“懒存储属性',当变量被首次初始化它不会计算初始值. “lazy” 修饰符的变量声明之前,把它作为一个懒存储属性。

延迟属性被使用:

要延迟对象的创建。

当属性是依赖于一个类的其他部分,即:尚未知道

代码如下:

class sample {
   lazy varno= number()// `var` declaration is required.}class number {var name ="Swift"}var firstsample = sample()
println(firstsample.no.name)

当我们使用 playground 运行上面的程序,我们得到以下结果
Swift
实例变量
在Objective C 中,存储属性还必须有实例变量用于备份目的,存放在存储的属性声明的值。

Swift 集成了这些概念成一个“存储的属性”声明。而不必有一个相应的实例变量和备份值'存储属性“,包含通过变量名一个位置定义的有关变量属性所有信息集成,数据类型和存储器管理功能。

计算属性
而不是存储计算的属性值提供了一个getter和一个可选的 setter 间接来检索和设置其他属性和值。

代码如下:

class sample {var no1 =0.0, no2 =0.0var length =300.0, breadth =150.0var middle:(Double,Double){get{return(length /2, breadth /2)}set(axis){
         no1 = axis.0-(length /2)
         no2 = axis.1-(breadth /2)}}}var result = sample()
println(result.middle)
result.middle =(0.0,10.0)

println(result.no1)              
println(result.no2)

当我们使用 playground 运行上面的程序,我们得到以下结果

(150.0, 75.0)
-150.0
-65.0

当计算的属性留下了新的值为未定义默认值将针对特定的变量来设置。

计算属性为只读属性
在计算属性只读属性被定义为 getter,但不是 setter。它总是用来返回一个值。变量通过使用 '.' 语法访问,但不能被设置为其他值。

代码如下:

class film {var head =""var duration =0.0var metaInfo:[String:String]{return["head":self.head,"duration":"\(self.duration)"]}}var movie = film()
movie.head ="Swift Properties"
movie.duration =3.09

println(movie.metaInfo["head"]!)     
println(movie.metaInfo["duration"]!)

当我们使用 playground 运行上面的程序,我们得到以下结果

Swift Properties
3.09

计算属性属性观察者
在Swift 中使用属性观察者来观察和设置属性值响应。 当每一次属性值设置属性观察者都被调用。 除了懒存储属性,我们可以通过添加属性观察者“继承”属性“覆盖”方法。

在存放值之前 - willset

存储新的值之后 - didset

当一个属性被设置在初始化 willset 和 didset 观察者不能调用。

代码如下:

classSamplepgm{var counter:Int=0{
      willSet(newTotal){
         println("Total Counter is: \(newTotal)")}
      didSet{if counter > oldValue {
            println("Newly Added Counter \(counter - oldValue)")}}}}letNewCounter=Samplepgm()NewCounter.counter =100NewCounter.counter =800

当我们使用 playground 运行上面的程序,我们得到以下结果

Total Counter is: 100
Newly Added Counter 100
Total Counter is: 800
Newly Added Counter 700

局部和全局变量
对于计算和观察属性局部和全局变量的声明。

类型属性
属性定义类型定义部分有大括号{},并且变量的范围也被前面所定义。要定义值类型使用 “static” 关键字以及类的类型使用 “class” 关键字。

语法

代码如下:

structStructname{staticvar storedTypeProperty =" "staticvar computedTypeProperty:Int{// return an Int value here}}enumEnumname{staticvar storedTypeProperty =" "staticvar computedTypeProperty:Int{// return an Int value here}}classClassname{classvar computedTypeProperty:Int{// return an Int value here}}

查询和设置属性
类似于实例属性类型属性查询和设置,只是使用 “.” 语法,而不用指向该实例的类型。

代码如下:

structStudMarks{staticlet markCount =97staticvar totalCount =0varInternalMarks:Int=0{
      didSet {ifInternalMarks>StudMarks.markCount {InternalMarks=StudMarks.markCount
         }ifInternalMarks>StudMarks.totalCount {StudMarks.totalCount =InternalMarks}}}}var stud1Mark1 =StudMarks()var stud1Mark2 =StudMarks()

stud1Mark1.InternalMarks=98
println(stud1Mark1.InternalMarks)

stud1Mark2.InternalMarks=87
println(stud1Mark2.InternalMarks)

当我们使用 playground 运行上面的程序,我们得到以下结果

97
87
(0)

相关推荐

  • Swift 编程语言入门教程

    原文地址:http://gashero.iteye.com/blog/2075324 目录 1   简介 2   Swift入门 3   简单值 4   控制流 5   函数与闭包 6   对象与类 7   枚举与结构 1   简介 今天凌晨Apple刚刚发布了Swift编程语言,本文从其发布的书籍<The Swift Programming Language>中摘录和提取而成.希望对各位的iOS&OSX开发有所帮助. Swift是供iOS和OS X应用编程的新编程语言,基于C和Obj

  • 超全面的Swift编码规范(推荐)

    前言 关于Swift的代码的相关规范,不同的开发者都有自己相应的规范,可能还是很多人根本就没有规范.为了保证同一个公司同一个项目组中代码美观并且一致,这里写下这份Swift编程规范指南.该指南首要目标是让代码紧凑,可读性更高且简洁. 代码格式 使用四个空格进行缩进 每行最多160个字符,这样可以避免一行过长(Xcode->Preferences->Text Editing->Page guide at column: 设置成160即可) 确保每个文件结尾都有空白行 确保每行都不以空白符作

  • 苹果公司编程语言Swift语言简介

    Swift 是一门新的编程语言,用于编写 iOS 和 OS X 应用程序.Swift 结合了 C 和 Objective-C 的优点并且不受C兼容性的限制.Swift 使用安全的编程模式并添加了很多新特性,这将使编程更简单,扩展性更强,也更有趣.Swift 支持 Cocoa 和 Cocoa Touch 框架. Swift 的开发从很久之前就开始了.为了给 Swift 打好基础,苹果公司改进了编译器,调试器和框架结构,让 Swift 使用自动引用计数(Automatic Reference Cou

  • 详解Swift编程中的方法与属性的概念

    方法 在 Swift 中特定类型的相关联功能被称为方法.在 Objective C 中类是用来定义方法,其中作为 Swift 语言为用户提供了灵活性,类,结构和枚举中可以定义使用方法. 实例方法 在 Swift 语言,类,结构和枚举实例通过实例方法访问. 实例方法提供的功能 访问和修改实例属性 函数关联实例的需要 实例方法可以写在花括号 {} 内.它隐含的访问方法和类实例的属性.当该类型指定具体实例它调用获得访问该特定实例. 语法 复制代码 代码如下: func funcname(Paramet

  • 详解Swift编程中的常量和变量

    常量 常量指的是程序无法在其执行期间改变的固定值. 常量可以是任何像整型常量,浮点常量,字符常量或字符串的基本数据类型.也可以是枚举常量. 这些常量和常规变量处理一样,只是它们的值不能在定义后进行修改. 声明常量 使用常量时,则必须使用关键字 let 声明它们如下: 复制代码 代码如下: let constantName = <initial value> 下面是一个简单的例子来说明如何在 Swift 中声明一个常量: 复制代码 代码如下: import Cocoa let constA =

  • 详解Swift编程中的for循环的编写方法

    for 循环是一个循环控制结构,可以有效地编写来执行的特定次数的循环. 语法 for 循环在 Swift 编程语言的语法是: 复制代码 代码如下: for init; condition; increment{    statement(s) } 下面是在一个循环的流程控制: 初始化 init 步骤首先被执行,并且仅一次.在这一步,可以声明和初始化任何循环控制变量. 只要一个分号出现,不需要一定把一个语句放在这里. 接下来,计算条件.如果为真,则执行循环体.如果是假,循环体不执行,只是在 for

  • Python pandas 列转行操作详解(类似hive中explode方法)

    最近在工作上用到Python的pandas库来处理excel文件,遇到列转行的问题.找了一番资料后成功了,记录一下. 1. 如果需要爆炸的只有一列: df=pd.DataFrame({'A':[1,2],'B':[[1,2],[1,2]]}) df Out[1]: A B 0 1 [1, 2] 1 2 [1, 2] 如果要爆炸B这一列,可以直接用explode方法(前提是你的pandas的版本要高于或等于0.25) df.explode('B') A B 0 1 1 1 1 2 2 2 1 3

  • 详解Java String中intern方法的原理与使用

    目录 简介 常量池简介 intern方法简介(JDK7) 原理(JDK6与JDK7) 例程测试 例程分析 jdk1.6 jdk1.7 应用实例 简介 本文介绍Java的String的intern方法的原理. 常量池简介 在 JAVA 语言中有8种基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池(在方法区)的概念.常量池就类似一个JAVA系统级别提供的缓存.8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊. Str

  • 详解Java编程中Annotation注解对象的使用方法

    注解(也被称为元数据)为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据.   1.基本语法 Java SE5内置三种标准注解 @Override:表示当前的方法定义将覆盖超类中的方法.如果你不小心拼写错误,或者方法签名对不上被覆 盖的方法,编译器就会发出错误提示 @Deprecated:如果程序员使用了注解为它的元素,那么编译器就会发出警告信息 @SupperessWarnings:关闭不当的编译器警告信息. Java SE5内置四种元注解 @Targ

  • 详解Swift语言中的类与结构体

    类 在 Swift 中类是建立灵活的构建块.类似于常量,变量和函数,用户可以定义的类的属性和方法.Swift给我们提供了声明类,而无需用户创建接口和实现文件的功能.Swift 允许我们创建类作为单个文件和外部接口,将默认在类一次初始化来创建. 使用类的好处: 继承获得一个类的属性到其他类 类型转换使用户能够在运行时检查类的类型 初始化器需要处理释放内存资源 引用计数允许类实例有一个以上的参考 类和结构的共同特征: 属性被定义为存储值 下标被定义为提供访问值 方法被初始化来改善功能 初始状态是由初

  • 详解Python编程中基本的数学计算使用

    数 在 Python 中,对数的规定比较简单,基本在小学数学水平即可理解. 那么,做为零基础学习这,也就从计算小学数学题目开始吧.因为从这里开始,数学的基础知识列位肯定过关了. >>> 3 3 >>> 3333333333333333333333333333333333333333 3333333333333333333333333333333333333333L >>> 3.222222 3.222222 上面显示的是在交互模式下,如果输入 3,就显

  • 详解Java编程中对线程的中断处理

    1. 引言 当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时--都需要通过一个线程去取消另一个线程正在执行的任务.Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制. 如果对Java中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此.中断机制是如何工作的?捕获或检测到中断后,是抛出InterruptedException还是重设中断状态以及在方法中吞掉中断状态会有什么后果?Thread.st

  • 详解Java编程中final,finalize,finally的区别

    final: final可以让你控制你的成员.方法或者是一个类是否可被覆写或继承等功能,这些特点使final在Java中拥有了一个不可或缺的地位,也是学习Java时必须要知道和掌握的关键字之一. final成员 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变.其初始化可以在两个地方,一是其定义处,二是在构造函数中,两者只能选其一. 下面程序很简单的演示了final的常规用

随机推荐