官方文档

下标脚本

类,结构体和枚举可以定义下标脚本,下标脚本可以认为是访问集合(collection),列表或序列的成员元素。你可是使用下标脚本来设置或通过索引检索值,而不需要调用实例特定的方法。例如,用下标脚本来访问一个数组(Array)实例中的元素,可以写成这样someArray[index],访问字典(Dictionary)实例中的元素可以写为someDictionary[key]

你可以为一个类型定义多个下标脚本,并且合适的下标脚本通过重载来使用,基于你传递的下表脚本的索引值类型。下标脚本没有限制单个纬度,并且你可以使用多个输入形参来定义下表脚本满足自定义类型的需求。

下标脚本的语法

下表脚本允许你通过在实例名后面的方括号传入一个或多个索引值对该实例进行访问和赋值。语法类似于实例方法和和计算属性的混合。写下标定义的时候要带上关键字subscript,并且指定一个或多个输入参数和返回值类型。不像实例方法,下标脚本只能是读写或者只读的。此行为有点像点计算属性的getter和setter:

subscript(index: Int) -> Int {
    get {
        // return an appropriate subscript value here
    }
    set(newValue) {
        // perform a suitable setting action here
    }
}

newValue的类型和下标脚本的返回值一样正如计算属性,你可以选择不去指定setter的(newValue)形参。如果你没有提供一个默认形参,那么你可以调用newValue

与只读计算属性一样,你可以给下标脚本使用get关键字:

subscipt(index: Int) -> {
    // return an appropriate subscript value here
}

下面是下标脚本的只读属性实现的过程的,定义了一个TiMetable来代表整数的n倍:

struct TiMetable {
    let multiplier: Int
    subscript(index: Int) -> Int {
        return multiplier * index
    }
}
let threeTimesTable = TimesTable(multiplier: 3)
print("six times three is \(threeTimesTable[6])")
// prints "six times three is 18"

在这个��中,创建了一个新的TiMetable实例来表示索引值的3倍。数值3作为结构体构造函数入参初始化实例成员multiplier

你可以通过下标脚本来得到结果,比如threeTimesTable[6]。这条语句访问了threeTimesTable的第六个元素,返回63倍即18

注意

TimesTable例子是基于一个固定的数学公式。它并不适合对threeTimesTable[someIndex]进行赋值操作,这也是为什么附属脚本只定义为只读的原因。

下标脚本用法

“下标脚本”确切的意思取决于它使用的上下文。通常下标脚本是用来访问集合(collection),列表(list)或序列(sequence)中元素的快捷方式。你可以在你自己特定的类或结构体中自由实现下标脚本来提供合适的功能。

例如,Swift的字典(Dictionary)类型实现了通过下标脚本来对其实例中存放的值进行存取操作。在下标脚本中使用和字典索引相同类型的值,并且把一个字典值类型的值赋值给这个下标脚本来为字典设值:

var numberOfLegs = ["spider": 8"ant": 6"cat": 4]
numberOfLegs["bird"] = 2

上面的��定义了一个名为numberOfLegs的变量并用一个字典字面量初始化出了包含三对键值的字典实例。numberOfLegs的字典存放值类型推断为[String:Int]。字典实例创建完成之后通过下标脚本的方式将整型值2赋值到字典实例的索引为bird的位置中。

更多关于字典(Dictionary)下标脚本的信息请参考读取和修改字典。

注意

Swift中字典的附属脚本实现中,在get部分返回值是Int?,上例中的numberOfLegs字典通过附属脚本返回的是一个Int?或者说“可选的int”,不是每个字典的索引都能得到一个整型值,对于没有设过值的索引的访问返回的结果就是nil;同样想要从字典实例中删除某个索引下的值也只需要给这个索引赋值为nil即可。

下标脚本选项

下标脚本允许任意数量的输入形参索引,并且这些输入形参可以是任何类型。下标脚本也可以返回任何类型。下标脚本可以使用变量参数和可变参数,但是不能使用输入输出(in-out)参数或提供默认的参数值。

一个类或结构体可以根据自身需要提供多个下标脚本实现,在定义下标脚本时通过传入参数的类型进行区分,使用下标脚本时会自动匹配合适的下标脚本实现运行,这就是下标脚本的重载

一个下标脚本参数是最常见的情况,但只要有合适的场景也可以定义多个下标脚本参数。如下例定义了一个Matrix结构体,将呈现一个Double类型的二维矩阵。Matrix结构体的下标脚本需要两个整型参数:

struct Martix {
    let rows: Int, columns: Int
    var grid: [Double]
    init(rows: Int,columns: Int) {
    self.rows = rows
    self.columns = columns
    grid = Array(count: rows * cloumns,repeatedValue: 0.0)
    }
    func indexIsValidForRow(row: Int,column: Int) -> Bool {
        return row >= 0 && row < rows && cloumn >= 0 && cloumn < cloumns
    }
    subscript(row: Int,column: Int) -> Double {
        get {
            assert(indexIsValidForRow(row, cloumn: column),"index out of range")
            return grid[(row * columns) + column]
        }
        set {
            assert(indexIsValidForRow(row, column: column),"Index out of range")
            grid[(row * columns) + column] = newValue
        }
    }
}

Matrix提供了一个有两个形参的构造方法,分别是rowscolumns,创建了一个足够容纳rows * columns个数的Double类型数组。通过传入数组长度和初始值0。0到数组的一个构造器,将Matrix中每个元素初始值0。0。关于数组的构造方法和析构方法请参考创建一个空数组。

你可以通过传入合适的rowcolumn的数量来构造一个新的Matrix实例:

var matrix = Matrix(rows: 2,columns: 2)

上例中创建了一个新的两行两列的Matrix实例。在阅读顺序从左上到右下的Matrix实例中的数组实例grid是矩阵二维数组的扁平化存储:

将值赋给带有rowcolumn下标脚本的matrix实例表达式可以完成赋值操作,下标脚本入参使用逗号分割:

matrix[0,1] = 1.5
matrix[1,0] = 3.2

上面两条语句分别让matrix的右上值为 1.5,坐下值为 3.2:

Matrix下标脚本的gettersetter中同时调用了下标脚本入参的rowcolumn是否有效的判断。为了方便进行断言,Matrix包含了一个名为indexIsValidForRow(_:column:)的成员方法,用来确认入参的rowcolumn值是否会造成数组越界:

func indexIsValidForRow(row: Int, column: Int) -> Bool {
    return row >= 0 && row < rows && column >= 0 && column < columns
}

断言在下标脚本越界时触发:

let someValue = matrix[2,2]
// this triggers an assert,because [2,2] is outside of the matrix bounds

Swift2.1-下标脚本的更多相关文章

  1. 四 Swift学习之集合类型 (Collection Types)

  2. Swift编程高级教程(三)集合类型-数组

    集合类型―数组Swift语言提供了两种集合数据类型:数组和字典,数组是一系列相同类型的变量值有序存储;字典是一系列相同类型的变量值的无序存储,可以通过一个唯一标识符(键)来引用和查找。提示Swift的数组类型的变量在常量,变量赋值或者给函数和方法传参的时候会表现出和其他类型不一样的行为。故Swift的数组是类型安全的!

  3. swift之附属脚本

    例如,Swift的字典实现了通过附属脚本来对其实例中存放的值进行存取操作。为了方便进行断言,Matrix包含了一个名为indexIsValid的成员方法,用来确认入参的row或column值是否会造成数组越界:断言在附属脚本越界时触发:

  4. [翻译]Swift编程语言——下标

    不会给threeTimesTable[someIndex]赋予一个新值,所以TimesTable的这个下标是一个只读下标。举例来说,Swift的字典类型实现了一个下标来实现对字典类型实例中的值的读取和赋值。Matrix实例的grid数组是一个平的矩阵,读取它要从左上到右下:传递行和列的值给下标,可以对矩阵中的值进行设置:这两句调用了下标的setter给矩阵右上角的位置设置了值1.5,给左下角的位置设置了值3.2:Matrix下标的getter和setter都含有一个检查下标的row和column是否合法的

  5. Swift学习笔记(十)附属脚本

    下面代码演示了一个在TimesTable结构体中使用只读附属脚本的用法,该结构体用来展示传入整数的n倍。Swift的字典实现了通过附属脚本来对其实例中存放的值进行存取操作。一个类或结构体可以根据自身需要提供多个附属脚本实现,在定义附属脚本时通过入参个类型进行区分,使用附属脚本时会自动匹配合适的附属脚本实现运行,这就是附属脚本的重载。如下例定义了一个Matrix结构体,将呈现一个Double类型的二维矩阵。

  6. swift详解之八---------------下标脚本

    一个类或者结构体中可以有多个下标脚本可以根据传入的参数类型进行区分Matrix提供了一个两个入参的构造方法,入参分别是rows和columns,创建了一个足够容纳rows*columns个数的Double类型数组。在阅读顺序从左上到右下的Matrix实例中的数组实例grid是矩阵二维数组的扁平化存储:示意图grid=[0.0,0.0,0.0]col0col1row0[0.0,row10.0,0.0]将值赋给带有row和column下标脚本的matrix实例表达式可以完成赋值操作,下标脚本入参使用逗号分割m

  7. swift基础教程——数组和字典

    /*复制,再编辑,自己留着看*/Swift提供两种集合类型来存储集合,数组和字典。//看起来字典非常像map在Swift中,数组和字典的键和值都必须明确它的类型。这意味这数组和字典不会插入一个错误的类型的值,以致于出错。这也意味着当你在数组和字典中取回数值的时候能够确定它的类型。所以Swift数组是类型安全的,因为它一直都确定它自身所能包含的值。

  8. Swift下标(Subscripts)

    在Swift中,类、结构体和枚举都是支持下标语法的。使用过数组、字典的朋友都见过array[index]。通过这样的方式可以设置数据和取数,会很方便也很简洁。你可以给一个类定义多个下标,也可以在一个下标中定义一个或多个参数。下标的关键字是subscript,常用格式如下:下面我们以数组为例,给大家介绍下标的创建和使用。

  9. Swift2.1-下标脚本

    不像实例方法,下标脚本只能是读写或者只读的。下标脚本用法“下标脚本”确切的意思取决于它使用的上下文。例如,Swift的字典类型实现了通过下标脚本来对其实例中存放的值进行存取操作。字典实例创建完成之后通过下标脚本的方式将整型值2赋值到字典实例的索引为bird的位置中。更多关于字典下标脚本的信息请参考读取和修改字典。下标脚本选项下标脚本允许任意数量的输入形参索引,并且这些输入形参可以是任何类型。

  10. Swift附属脚本

    附属脚本用法根据使用场景不同附属脚本也具有不同的含义。附属脚本选项附属脚本允许任意数量的入参索引,并且每个入参类型也没有限制。为了方便进行断言,Matrix包含了一个名为indexIsValid的成员方法,用来确认入参的row或column值是否会造成数组越界:断言在附属脚本越界时触发:

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部