스위프트 첨자 스크립트


하위 스크립트는 클래스, 구조체 및 열거형과 같은 대상에서 정의될 수 있으며, 인스턴스의 특정 할당 및 액세스 방법을 호출하지 않고 개체, 컬렉션 또는 시퀀스에 액세스하는 지름길로 간주될 수 있습니다.

예를 들어, 아래 첨자 스크립트를 사용하여 배열(Array) 인스턴스의 요소에 액세스하려면 someArray[index]를 작성하고, 사전(Dictionary) 인스턴스의 요소에 액세스하려면 someDictionary[key]를 작성하면 됩니다. .

동일 대상에 대해 여러 개의 첨자 스크립트를 정의할 수 있고, 다양한 인덱스 값 유형으로 오버로드할 수 있으며, 인덱스 값의 개수는 여러 개가 될 수 있습니다.


하위 스크립트 구문 및 응용 프로그램

Syntax

하위 스크립트를 사용하면 인스턴스 뒤의 대괄호 안에 하나 이상의 인덱스 값을 전달하여 인스턴스에 액세스하고 값을 할당할 수 있습니다.

구문은 인스턴스 메서드와 계산된 속성을 혼합한 것과 유사합니다.

인스턴스 메서드 정의와 유사하게 첨자 스크립트 정의에서는 첨자 키워드를 사용하여 입력 매개변수(하나 이상)와 반환 유형을 명시적으로 선언합니다.

인스턴스 방식과 다르게 첨자 스크립트는 읽기-쓰기 또는 읽기 전용으로 설정할 수 있습니다. 이 방법은 계산된 속성의 getter 및 setter와 약간 비슷합니다.

subscript(index: Int) -> Int {
    get {
        // 用于下标脚本值的声明
    }
    set(newValue) {
        // 执行赋值操作
    }
}

Instance 1

import Cocoa

struct subexample {
    let decrementer: Int
    subscript(index: Int) -> Int {
        return decrementer / index
    }
}
let division = subexample(decrementer: 100)

print("100 除以 9 等于 \(division[9])")
print("100 除以 2 等于 \(division[2])")
print("100 除以 3 等于 \(division[3])")
print("100 除以 5 等于 \(division[5])")
print("100 除以 7 等于 \(division[7])")

위 프로그램 실행의 출력 결과는 다음과 같습니다.

100 除以 9 等于 11
100 除以 2 等于 50
100 除以 3 等于 33
100 除以 5 等于 20
100 除以 7 等于 14

위 예에서 나누기 연산의 인스턴스는 다음을 통해 생성됩니다. 하위 예제 구조. 인스턴스 멤버 감소기를 초기화하기 위해 값 100이 구조 생성자에 매개 변수로 전달됩니다.

스크립트에 첨자를 붙여 결과를 얻을 수 있습니다. 예를 들어 Division[2]는 100을 2로 나눈 값입니다.

예제 2

import Cocoa

class daysofaweek {
    private var days = ["Sunday", "Monday", "Tuesday", "Wednesday",
        "Thursday", "Friday", "saturday"]
    subscript(index: Int) -> String {
        get {
            return days[index]   // 声明下标脚本的值
        }
        set(newValue) {
            self.days[index] = newValue   // 执行赋值操作
        }
    }
}
var p = daysofaweek()

print(p[0])
print(p[1])
print(p[2])
print(p[3])

위 프로그램의 실행 출력은 다음과 같습니다.

Sunday
Monday
Tuesday
Wednesday

Usage

아래 첨자 스크립트도 사용 시나리오에 따라 다른 의미를 갖습니다.

일반적으로 아래 첨자 스크립트는 컬렉션, 목록 또는 시퀀스의 요소에 액세스하는 데 사용되는 바로가기입니다.

적절한 기능을 제공하기 위해 특정 클래스나 구조에 아래 첨자 스크립트를 자유롭게 구현할 수 있습니다.

예를 들어 Swift의 사전은 아래 첨자 스크립트를 통해 인스턴스에 저장된 값에 대한 액세스를 구현합니다. 첨자 스크립트에서 사전 인덱스와 동일한 유형의 값을 사용하고, 첨자 발에 사전 값 유형 값을 할당하여 사전에 대한 값을 설정합니다.

import Cocoa

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

print(numberOfLegs)

위 프로그램 실행의 출력 결과는 다음과 같습니다.

["ant": 6, "bird": 2, "cat": 4, "spider": 8]

위의 예에서는 numberOfLegs라는 변수가 사전 리터럴과 함께 세 개의 키-값 쌍을 포함하는 사전 인스턴스를 초기화합니다. numberOfLegs의 사전 저장 값 유형은 Dictionary


Subscript 스크립트 옵션

Subscript 스크립트로 입력 매개변수 인덱스를 원하는 수만큼 허용하며 각 입력 매개변수 유형에는 제한이 없습니다.

아래 첨자 스크립트의 반환 값은 모든 유형이 될 수 있습니다.

하위 스크립트는 가변 매개변수와 가변 매개변수를 사용할 수 있습니다.

클래스나 구조체는 필요에 따라 여러 개의 첨자 스크립트 구현을 제공할 수 있습니다. 첨자 스크립트를 정의할 때 전달된 매개 변수의 유형으로 구별됩니다. 첨자 스크립트를 사용하면 자동으로 적절한 첨자 스크립트와 일치합니다. 구현하고 실행하는 것은 subscript 스크립트의 오버로드입니다.

import Cocoa

struct Matrix {
    let rows: Int, columns: Int
    var print: [Double]
    init(rows: Int, columns: Int) {
        self.rows = rows
        self.columns = columns
        print = Array(count: rows * columns, repeatedValue: 0.0)
    }
    subscript(row: Int, column: Int) -> Double {
        get {
            return print[(row * columns) + column]
        }
        set {
            print[(row * columns) + column] = newValue
        }
    }
}
// 创建了一个新的 3 行 3 列的Matrix实例
var mat = Matrix(rows: 3, columns: 3)

// 通过下标脚本设置值
mat[0,0] = 1.0
mat[0,1] = 2.0
mat[1,0] = 3.0
mat[1,1] = 5.0

// 通过下标脚本获取值
print("\(mat[0,0])")
print("\(mat[0,1])")
print("\(mat[1,0])")
print("\(mat[1,1])")

위 프로그램 실행의 출력 결과는 다음과 같습니다.

1.0
2.0
3.0
5.0

Matrix 구조는 두 개의 입력 매개변수가 있는 구성 방법을 제공합니다. 두 매개변수는 행과 열이며, 행 * 열 수를 수용하기에 충분한 Double 유형 배열을 생성합니다. 저장을 위해 배열의 크기를 설정하고 배열의 각 요소를 0.0으로 초기화합니다.

적절한 수의 행과 열을 전달하여 새로운 Matrix 인스턴스를 생성할 수 있습니다.