Swift:实例方法和类型方法

大家对“实例方法和类型方法”的概念应该不陌生了,在objective-c中很常见。例如:

1. 实例方法(减号开头)

- (instancetype)init;

调用的时候,必须先进行实例化一个对象(alloc), 然后调用init方法。

2. 类型方法(加号开头)

+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations

调用的时候,直接使用UIView的类型就可以了。

而在Swift中写法有所改变,它使用class和static关键字来标示。而且不仅仅是作用在类中,枚举和结构体(enum, struct)中也有相应的方法。

在class类型上下文中,我们使用class;其他的使用static。

一、作用于结构(注:代码中,有关存储属性及计算属性的知识,我会在后续章节进行详细的介绍。)

struct Point {
    let x: Double
    let y: Double

    // 存储属性
    static let zero = Point(x: 0, y: 0)

    // 计算属性
    static var ones: [Point] {
        return [
            Point(x: 1, y: 1),
            Point(x: -1, y: 1),
            Point(x: 1, y: -1),
            Point(x: -1, y: -1)
        ]
    }

    // 类型方法
    static func add(p1: Point, p2: Point) -> Point {
        return Point(x: p1.x + p2.x, y: p1.y + p2.y)
    }
}

let p = Point(x: 3, y: 4)

Point.zero
Point.ones
Point.add(Point(x: 1, y: 2), p2: Point(x: 2, y: 1))

可以看到,在结构中,我们可以在其属性或者方法前面加static进行修饰,调用的时候,直接可以通过类型名称"Point"
出对应的属性或者方法。

二、作用于类

class Square {
    // 类型属性,用class关键字
    class var PI: Double{
        return 3.14
    }
}

可以看到,在类中,我们可以在其属性或者方法前面加class进行修饰,调用的时候,直接Square.PI 就可以了。 代码中是对“计算属性”进行了class修饰。而这里的计算属性只是简写,我们也可以写成下面的方式:

class Square {
    class var PI: Double{
        get { return 3.14 }
    }
}

但需要注意的是,存储属性不能使用class进行修饰。

class Student {
    class var phone: String?
}

编译后会报错:“class variables not yet supported”

而用static就可以了。

class Student {
    static var phone: String?
}

三、作用于协议

protocol MyProtocol {
    static func foo() -> String
}

struct MyStruct: MyProtocol {
    static func foo() -> String {
        return "MyStruct"
    }
}

class MyClass {
    class func foo() -> String {
        return "MyClass"
    }
}

可以看出,在protocol中定义的属性或者方法,是在其前面加上static修饰符的,但问题来了, 实现协议有可能是结构体或者枚举,也有可能是类。那实现体中应该使用什么修饰符?通过观察上面的写法可以看出:

在protocol中定义的方法或者计算属性,类型修饰符是static;在实现的结构或者枚举中,修饰符使用static,在实现的class中,修饰符使用class。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 03:51:30

Swift:实例方法和类型方法的相关文章

Swift语言之类型方法

Swift语言有很多特性,其中之一就是类型方法,相对于其他比较流行的编程语言(C#.Java),在Swift中类型方法最大的特征在于它的可继承性,我们举个例子说明: 俗话说,龙生龙凤生凤老鼠生儿会打洞:虽说龙和鼠都属于动物,但毕竟不是同类,所以生出来的当然不一样. 同理,对于Dragon和Mouse两个类而言,它们的newInstance类型方法返回的结果应该是各自类的实例: 我们先创建一个名为Animal的协议: protocol Animal { class func newInstance

Swift学习笔记(14)--方法

1.分类 方法分为实例方法和类型方法 实例方法(Instance Methods):与java中的类似,略 类型方法(Type Methods):与java.oc中的类方法类似.声明类的类型方法,在方法的func关键字之前加上关键字class:声明结构体和枚举的类型方法,在方法的func关键字之前加上关键字static. 方法的参数名参见学习笔记的函数章节 2.在实例方法中修改值类型和self 结构体和枚举是值类型.一般情况下,值类型的属性不能在它的实例方法中被修改. 但是,如果你确实需要在某个

Swift语法学习之 方法

方法:1.实例方法(OC中实例方法,通过创建实例调用) 2.类型方法(OC中的类方法,类名调用) 类.结构体.枚举都可以定义实例方法和类型方法:实例方法为给定类型的实例封装了具体的任务与功能.类型方法与类型本身相关联.类型方法与 Objective-C 中的类方法(class methods)相似. 结构体和枚举能够定义方法是 Swift 与 C/Objective-C 的主要区别之一.在 Objective-C 中,类是唯一能定义方法的类型.但在 Swift 中,你不仅能选择是否要定义一个类/

Swift Programming Language ——实例方法(Instance Methods)和类型方法(Type Methods)

方法是与某些特定类型相关联的函数.类.结构体.枚举都可以定义实例方法:实例方法为给定类型的实例封装了具体的任务与功能.类.结构体.枚举也可以定义类型方法:类型方法与类型本身相关联.类型方法与 Objective-C 中的类方法(class methods)相似. 结构体和枚举能够定义方法是 Swift 与 C/Objective-C 的主要区别之一.在 Objective-C 中,类是唯一能定义方法的类型.但在 Swift 中,你不仅能选择是否要定义一个类/结构体/枚举,还能灵活的在你创建的类型

Swift之键盘类型与常见的键盘隐藏方法

// //  ViewController.swift //  UITextField键盘类型 // //  Created by mac on 15/4/19. //  Copyright (c) 2015年 mac. All rights reserved. // import UIKit class ViewController: UIViewController ,UITextFieldDelegate{ var text = UITextField() var pwdtext = UI

Swift学习】Swift编程之旅---方法(十五)

在Swift中结构体和枚举也能够定义方法,而在 Objective-C 中,类是唯一能定义方法的类型. 实例方法 实例方法是属于某个特定类.结构体或者枚举类型实例的方法,实例方法提供访问和修改实例属性的途径,实例方法的语法与函数完全一致.实例方法能够隐式访问它所属类型的所有的其他实例方法和属性.实例方法只能被它所属的类的某个特定实例调用.实例方法不能脱离于现存的实例而被调用. class Counter { var count = 0 func increment() { count++ } f

swift学习笔记之--方法

一.说明 跟oc一样,面向对象,swift重点额方法可以分为2大类: (1)实例方法 oc中为减号方法(对象方法) (2)类型方法 oc中的加号方法(类方法) 二.实例方法 只能是对象调用的方法 代码示例: 1 class Dog { 2 func run() { 3 println("Dog--->run") 4 } 5 } 6 var d = Dog() 7 d.run( 说明: 第2行定义了一个run方法 第7行调用run方法:调用方法也跟调用函数很像,格式是“对象名.方法

Swift编程语言中的方法引用(基于2.2版本)

由于Apple官方的<The Swift Programming Guide>对Swift编程语言中的方法引用介绍得不多,所以这里将更深入.详细地介绍Swift中的方法引用. Swift与Objective-C不同,由于Objective-C的方法都属于“消息”,因此直接用selector的消息签名即可表示一条确定的消息作为方法引用.而Swift的方法更类似于C++.Java中的方法,也就是说比Objective-C更静态,因此它不具有如此般灵活性. 另外,在Swift编程语言中,方法引用与C

Swift 语言附注 类型

本页包含内容: 类型注解(Type Annotation) 类型标识符(Type Identifier) 元组类型(Tuple Type) 函数类型(Function Type) 数组类型(Array Type) 可选类型(Optional Type) 隐式解析可选类型(Implicitly Unwrapped Optional Type) 协议合成类型(Protocol Composition Type) 元类型(Metatype Type) 类型继承子句(Type Inheritance C