[Swift]属性和下标

5G NR UCI完全指南:PUCCH格式与上行反馈调测 5G NR物理层中,上行控制信息(UCI)是终端反馈调度状态的关键载体。它包含HARQ-ACK、CSI和SR三类内容,分别负责确认下行数据、上报信道质量以及请求上行资源。理解UCI的编码结构、PUCCH格式选择以及UCI on PUSCH的速率匹配原理,是优化上行调度和链路性能的基础。在实际网络中,错误的codebook配置、PUCCH资源不足或CSI bit估算偏差,都会导致反馈丢失、BLER抬升甚至吞吐骤降。针对这些工程痛点,系统地梳理UCI承载内容、物理信道映射、关键参数配置与典型调测案例,能够帮助开 阅读详情

1. 属性的基本概念:

    1) Swift将结构体和类中可以通过外部访问的非方法类成员都叫做属性;

    2) 注意和OC的属性作区分,OC中的属性并不是数据成员,而是专门为访问封装后的数据成员所设计的(通过get和set设置private封装过的数据成员),而Swift的属性既包括数据成员也包括这些访问封装后的数据成员的方法(get和set等);

    3) Swift中的属性主要有:存储属性(即OC和C++中的数据成员)、计算属性(用于访问封装后的数据成员的方法(精确地讲应该是一段脚本)、属性观察者(主要是指didSet和willSet脚本,在存储属性被修改前后被调用,用以观察属性变化的过程,非常方便调试)、静态属性(和C++概念一样,即属于类而不属于对象)、索引属性(即为类或结构体定义下标访问,即C++中的operator[]的重载);


2. 存储属性:

    1) 即前面例子中的数据成员;

    2) 这里主要要强调的是常量属性和变量属性之间的关系以及常量结构体、常量类对象(实际上是常引用,Swift只能通过引用访问对象)和常/变量属性之间的关系:

class A
{
    let a: Int = 10
    var b: Int = 20
}

struct B
{
    let a: Int = 10
    var b: Int = 20
}

// 对于结构体来说

var b = B()
// b.a = 7 // 常量成员不可修改
b.b = 8 // 变量成员可以随意修改

let bb = B() // 对于结构体的常量任何成员都不可修改,因为结构体是值类型的,bb就代表结构体实体
// bb.a = 8
// bb.b = 7

// 再来看看类对象

var a = A() // 注意!此时a只是个引用
// a.a = 7 // 常量成员无论如何都是不可修改的
a.b = 77 // 变量成员当然可以通过引用修改,毕竟引用就相当于C语言中的指针

let aa = A() // 注意!aa在这里是常引用,就等价于C++中的class A * const aa = &A()
// 懂C++的朋友都知道这个是场指针而不是指向常量的指针
// 意思就是指针的指向不能改变,但是可以通过该指针来修改成员,因此
aa.b = 43 // 这个是对的!
// aa = A() // 这就不对了,aa的指向不能改变,这里让它指向了另一个出炉的新对象实体,因此肯定是会报错的了!
// aa.a = 7 // 还是那句话,常量成员是无论如何都不能修改的
    3) 惰性存储属性——延迟加载:将存储属性声明为lazy就变成了惰性存储属性,它的功能就是延迟加载,即在实例化的时候并不会在内存中加载该存储属性,只有在第一次访问它的时候才会在内存中加载该属性,这在处理非常消耗资源的初始化工作时非常有用,比如一个类中有一个存储属性是另一个类的对象,而该对象非常庞大(该对象的实例化有可能是读取一个非常庞大的资源,但是该资源又不经常使用,也有可能会在程序运行的后期才大量使用),因此一开始就加载该对象将会造成非常严重的资源浪费,而声明为lazy将会非常有帮助!

!!注意!lazy只能用于var不能用于let,因为let要求定义时必须立即初始化的,如果lazy用于let会直接编译报错!

func testProc() -> Int
{
    println("hahaha!")
    return 15
}

class Test
{
    // lazy let a: Int = 2 // Bad! lazy不能用于let
    lazy var a: Int = testProc()
    var ss: [String] = []
}

var t = Test()

t.ss += ["111"]
t.ss += ["222"]
t.ss.append("333")
println(t.ss) // [111, 222, 333]

println(t.a)
// hahaha! 先加载
// 15 生成a的内存后才可以打印a的值


3. 计算属性:

    1) 计算属性本身不能存储数据,但不过可以通过它间接地访问一些存储属性,而计算属性顾名思义就是通过其它存储属性计算而得的数据,比如属性c的值是由属性a和属性b连接而得,但是我们又没有必要重新定义一个c成员而增加不必要的内存空间,但是又不想非常麻烦地增加一条方法专门用于返回a和b的连接(并且调用的是否非常麻烦,必须要通过调用成员方法的形式),有没有一种解决方案,让我们仿佛定义了一个成员c,并且可以通过非常简洁的“类名.c”的方式访问该成员,但实际上该成员的内存空间并不存在,通过这种方式访问的时候背后实际上是执行了return a + b这条语句,这不就达到上述要求了嘛(即不浪费空间同时访问的方式也非常简洁),同时还可以通过对c的赋值而达到间接设置a和b的目的!答案时肯定的,Swift提供了计算属性来实现上述目的;

    2) 计算属性的组成:有一个取值访问器getter和一个设置访问器setter组成,只要定义setter,就可以通过上述.c = XXX的方式将XXX分解并设置a和b,而通过定义getter就可以通过.c的方式间接访问a + b连接值:

class Add
{
    var a: Int = 1
    var b: Int = 2
    var sum: Int {
        get { // getter取值访问器器
            return a + b
        }
        set { // setter设置访问器
            a = newValue / 2 // newValue是默认传入设置数据的名字,当然也可以自己定义改名字
            b = a
        }
        // set(myValue) {} // 自己定义myValue的名字,但是要以传参的方式写!newValue默认名可以加参数
    }
}

var t = Add()
println(t.sum) // 3,相当于调用了get方法,实际并没有存储sum内存,而是通过a + b计算而得!
t.sum = 6 // 相当于调用了set方法,将值平分给a和b
println(t.a) // 3
println(t.b) // 3
上述是可读写的计算属性,即可以读getter,也可以写setter,再来看一个经典的例子,即类中有两个成员,一个是姓一个是名,定义一个计算属性“全名”,通过getter获得“姓.名”形式的字符串,通过setter分别设置姓和名两个属性的值:

import Cocoa

class Name
{
    var firstname = ""
    var lastname = ""
    var fullname: String {
        get {
            return firstname + lastname
        }
        set(thefullname) { // 我们这里使用的String来自Cocoa框架
            var names = thefullname.componentsSeparatedByString(".")
            firstname = names[0]
            lastname = names[1]
        }
    }
}

var name = Name()
name.fullname = "Jhon.Lecter"
println("First name = \(name.firstname), last name = \(name.lastname)")
println(name.fullname)

    3) 只读计算属性:上述的计算属性是可读可写的,其实就只写get而不写set就可以了(但是早一点的版本不允许这样做),而更简洁的写法就是不写get也不写set直接在花括号中写语句,最后返回(return)即可:

class Cube
{
    var lentgh = 5
    var width = 10
    var height = 34
    var volume: Int { // 只读属性直接写代码
        return lentgh * width * height
    }
}

var cube = Cube()
println(cube.volume) // 1700
// cube.volume = 53 // Bad! 只读计算属性不能写
    4) 结构体中的计算属性和class一样,这里再示范一下枚举的计算属性,其实都是一样的:

enum WeekDays: String
{
    case Monday = "Monday"
    case Tuesday = "Tuesday"
    case Wednesday = "Wednesday"
    case Thursday = "Thursday"
    case Fridaya = "Friday"
    
    var output: String { // self就是指实例本身,就跟C++的this指针的一样相同
        return "Today is \(self.rawValue)."
    }
}

var day = WeekDays.Thursday
println(day.output) // Today is Thursday.


4. 属性观察器:

    1) 是Swift的一种监听机制,只能作用于变量存储属性,可以捕获变量存储属性在改变前后的值,不能作用于let定义的常量属性,也不能作用于lazy定义的惰性存储属性;

    2) 由于属性观察器不是计算属性,因此不能包含get和set,实际上它提供了两种方法willSet(在修改之前调用,捕获修改的新值)和didSet(在修改之后调用,捕获修改之前的旧值):

class Counter
{
    var cnt: Int = 0 { // 由于属性观察器只能作用于普通变量,因此必须对其初始化,如果不显示初始化也必须得定义构造器,否则会报错!
        // !注意,cnt必须指定类型!否则会报错!这是设定属性观察器时比较特殊的地方!捕获新设置值,在修改之前调用
        willSet { // 不写自定义参数默认名称为newValue,或者willSet(myNewValueName)
            println("The new value is \(newValue)")
        }
        // 捕获设置之前的旧值,在修改之后调用
        didSet { // 默认参数名为oldValue,或者didSet(myOldValueName)
            println("The old value is \(oldValue)")
        }
    }
}

var one = Counter()
one.cnt = 12
one.cnt = 23
// The new value is 12
// The old value is 0
// The new value is 23
// The old value is 12

    3) 属性观察者不能用于枚举,而只能用于结构体和类,因为枚举不能定义存储属性(但是枚举可以定义计算属性(只要不是存储的都可以定义))!


5. 计算属性和属性观察者在全局也可以使用(即在类、结构体、枚举外部也可以使用):

var a = 0
var b = 0
var c: Int {
    get {
        return a + b
    }
    set {
        a = newValue / 2
        b = a
    }
}

c = 5
println(a) // 2
println(b) // 2
a = 7
b = 15
println(c) // 22

var d: Int = 1 {
    willSet {
        println("newValue = \(newValue)")
    }
    didSet {
        println("oldValue = \(oldValue)")
    }
}

d = 2
d = 10
// newValue = 2
// oldValue = 1
// newValue = 10
// oldValue = 2

6. 静态属性:

    1) 和C++静态属性的概念,即属于类而不属于对象,举个很简单的例子,属性有账户、余额、利率三个,只有账户和余额这两个属性会因人而异但是利率对于所有账户来说都是一样的,而这类属性就可以定义成静态属性;

    2) 如上述,像账户、余额这样的属性属于实例属性,而利率这样的属性就是类型属性,也叫做静态属性!

    3) 访问规则和C++一样,直接用“类名.静态属性名”的方式访问,并且不需要实例化,因为属于类而不属于实例;

    4) 静态属性和费静态属性之间的调用关系也和C++一样,静态属性可以调用任意静态属性,但是静态属性不能访问费静态属性,而非静态属性可以访问或调用静态属性,总的来说就是静态属性作用范围更大一点;

    5) 在Swift中枚举、结构体和类都可以定义静态属性,现在来看一下这三者的区别:

class A
{
    // 只支持计算属性!
    // 不支持不同存储属性以及带属性观察器的存储属性!
    // 感觉非常奇怪!
    
    class var a: Int {
        return 10
    }
    class var b: Int {
        get {
            return 5
        }
        set {
            println("haha")
        }
    }
}

struct B // 结构体支持的最多!基本能支持的都支持了!
{
    static var a: Int = 1 // 静态属性必须初始化!否则报错!
    static var b: Int { // 支持只读计算属性
        return 10
    }
    static var c: Int { // 支持可读可写计算属性
        get {
            return 5
        }
        set {
            a = newValue // 静态属性中访问静态属性不需要加类前缀
        }
    }
    static var d: Int = 10 { // 支持具有属性观察器的存储属性
        willSet {
            println("haha")
        }
        didSet {
            println("haha")
        }
    }
    
    var e: Int {
        return B.a // 但在非静态属性中访问静态属性必须要加类前缀,否则会报错!很奇怪!
    }
}

enum C
{
    case AA
    case BB
    case CC
    
    static var a: Int = 35 // 虽然不能定义普通存储属性但是可以定义静态存储属性
    static var b: Int {
        return 33
    }
    static var c: Int {
        get {
            return 23
        }
        set {
            a = 7
        }
    }
//    static var c: Int = 25 { // 虽然可以定义静态存储属性,但是不能定义静态的属性观察者!
//        didSet {
//            println("haha")
//        }
//        willSet {
//            println("hahaha")
//        }
//    }
}
    6) 一个关于枚举的静态属性的不错的例子:

enum Account
{
    case 中国银行
    case 中国工商银行
    case 中国建设银行
    case 中国农业银行
    
    static var interestRate: Double = 0.668
    static var staticProp: Double {
        return interestRate * 1_000_000.0
    }
    var instanceProp: Double {
        switch (self)
        {
        case .中国银行: Account.interestRate = 0.667
        case .中国工商银行: Account.interestRate = 0.669
        case .中国建设银行: Account.interestRate = 0.666
        case .中国农业银行: Account.interestRate = 0.668
        }
        
        return Account.interestRate * 1_000_000.0
    }
}

println(Account.staticProp) // 668000.0

var myAccount = Account.中国工商银行
println(myAccount.instanceProp) // 669000.0


7. 索引属性——添加下标访问方式:

    1) 类似于C++的重载operator[]运算符,只不过Swift的功能更强大,可以设定多维下标(三维、四维任意的),并且下标的类型任意(可以是Int也可以是String等等),由于Swift并没有提供二维数组,因此可以用下标属性来模拟二维数组或者多维数组;

    2) Swift对枚举、结构体、类都支持下标属性,但是下标属性不能定义为static的!以下是下标定义的一般形式:

subscript(索引参数列表) -> 返回值类型 { set和get的可读可写访问 或 直接return的只读访问 }
    3) 示例:

enum A
{
    case aa
    case bb
    case cc
    
    // 注意!下标不可以是静态的,因此下标只属于实例而不属于类型
    subscript(#index: Int) -> String { // 可以为下标添加外部变量名
        switch index // 这里只有return,因此是只读索引
        {
        case 0: return "aa"
        case 1: return "bb"
        case 2: return "cc"
        default: return ""
        }
    }
}

var a = A.aa
println(a[index: 0]) // aa
println(a[index: 2]) // cc

struct B
{
    subscript(str1 s1: String, str2 s2: String) -> String { // 下标(索引)的类型可以是任意的
        return s1 + s2
    }
}

var b = B()
println(b[str1: "xx", str2: "yy"]) // xxyy

class DoubleArrary
{
    var rows: Int // 二维数组的行数和列数
    var cols: Int
    var grid: [Int] // 用一位数组模拟二维数组
    
    init(rows: Int, cols: Int) { // 构造器
        self.rows = rows
        self.cols = cols
        grid = Array(count: rows * cols, repeatedValue: 0)
    }
    
    subscript(index: Int) -> Int { // 普通的一维数组访问,这里设定为只读
        return grid[index]
    }
    
    subscript(row: Int, col: Int) -> Int { // 可以重载,模拟二维数组访问,这里设定为可读可写下标访问
        get { // 取值访问器getter
           return grid[row * cols + col]
        }
        set { // 设置访问器setter
            grid[row * cols + col] = newValue
        }
    }
}

var arr = DoubleArrary(rows: 5, cols: 5) // 定义一个5 × 5的二维数组

for var i = 0; i < 5; i++
{
    for var j = 0; j < 5; j++
    {
        arr[i, j] = i * j
    }
}

for var i = 0; i < 5; i++
{
    for var j = 0; j < 5; j++
    {
        print("\(arr[i, j]) ")
    }
    println()
}

// 0 0 0 0 0
// 0 1 2 3 4
// 0 2 4 6 8
// 0 3 6 9 12
// 0 4 8 12 16
!!注意,下标个数没有限制,但是定义太多会影响性能!
深度理解嵌入(embedding)层 首先从one_hot开始: one_hot的优点:计算方便快捷、表达能力强。 one_hot的缺点:过于稀疏,过于占用资源,尤其是在数据量特别大时;数据之间完全独立。 阅读详情

相关推荐

Win10系统内存占用异常飙升?三步排查法快速定位问题根源

本文针对Win10系统内存占用异常飙升问题,提供了一套三步排查法。首先利用任务管理器和资源监视器进行深度系统体检,定位隐形内存消耗者;其次通过干净启动和禁用非必要后台服务,揪出导致内存泄漏的第三方软件或驱动;最后进行终极深度清理,包括检查内存完整性、调整虚拟内存设置以及更新关键驱动程序,帮助用户快速恢复系统流畅运行。

weixin_29251567的博客 196

Swift 下标

下标可以定义在类、结构体和枚举中,是访问集合、列表或序列中元素的快捷方式。可以使用下标的索引,设置和获取值,而不需要再调用对应的存取方法。举例来说,用下标访问一个Array实例中的元素可以写作,访问Dictionary实例中的元素可以写作。一个类型可以定义多个下标,通过不同索引类型进行对应的重载。下标不限于一维,你可以定义具有多个入参的下标满足自定义类型的需求。

xiaoxiaobukuang的专栏 1314

CTS实战:如何用set_sense优化时钟树平衡(附ICC2避坑指南)

本文深入探讨了在时钟树综合(CTS)中,如何正确使用`set_sense`命令优化时钟树平衡,并对比了其与`set_disable_timing`的本质区别。通过实战案例详细解析了`-stop_propagation`和`-clock_leaf`参数的应用场景,并提供了ICC2工具中的关键避坑指南,帮助后端工程师精准控制时钟拓扑,避免时序分析漏洞。

weixin_28933797的博客 459

Swift中的下标(subscript)

下标(subscript),使用subscript可以给任意类型(枚举、结构体、类)增加下标功能,有些地方也翻译为:小标脚本。subscript的语法类似于实例方法、计算属性,本质就是方法(函数)。

run_in_road的博客 1587

Keil5实战:如何高效导出变量数据并实现可视化分析

本文详细介绍了在Keil5开发环境中,如何利用调试脚本高效导出程序运行时变量数据的方法。通过编写脚本自动捕获数据并保存为文件,再结合Excel或Python进行可视化分析,为嵌入式调试与算法优化提供了数据支撑,显著提升开发效率。

silver的专栏 1105

支持向量机算法之鸢尾花特征分类【机器学习】

支持向量机(SVM)是一种二元分类模型。它的基本模型是在特征空间中定义最大区间的线性分类器,这使它不同于感知器;支持向量机还包括核技术,这使得它本质上是一个非线性分类器。支持向量机的学习策略是区间最大化,它可以形式化为求解凸二次规划的问题,等价于正则化铰链损失函数的最小化。支持向量机的学习算法是求解凸二次规划的优化算法。Scikit learn(sklearn)是机器学习中常见的第三方模块。它封装了常见的机器学习方法,包括回归、降维、分类、聚类等。实例的特征向量(以2D为例)映射到空间中的一些点,如下图中的

一键难忘的博客 4971

Swift高级分享 - Swift中下标的强大功能

使用下标访问各种集合中的元素,如数组和字典,不仅在Swift中很常见,而且在几乎所有相对现代的编程语言中都是如此。但是,下标方式实际上是在Swift中实现的,它既非常独特,又非常强大 - 因为它允许我们将自己的类型的下标API添加到标准库中。 本周,我们来看看下载是如何在Swift中运行的,以及一些将它融入我们设计API的方式 - 包括一些在Swift 5.1中添加的全新功能。 同时小编这里有些书...

weixin_30614109的博客 304

opencode : 无法将“opencode“项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

opencode命令识别问题与openclawcodexgemini确保的路径在 PATH 中。这个知识对所有 npm 全局工具通用。

一键难忘的博客 4521

#Swift 下标 Subscript - Access the elements of a collection

下标(Subscript)提供了一种简洁的语法来访问和修改类型的元素,尤其适用于集合类型。允许开发者为自己的类型添加访问逻辑和行为,可以是只读或读写的。下标支持 多参数、重载、以及 类型下标,使得它们非常灵活,可以在许多场景下替代字典或数组的索引访问。

B9班的真高兴 671

Autosar Configuration(十四)SomeIP之配置SoAd

本文主要介绍SomeIp协议栈中的SoAd在Configurator中的详细配置

king110108的专栏 2600

16、天文时间序列分类:基于人工神经网络的研究

本研究探讨了基于人工神经网络的天文时间序列分类方法,重点比较了MLP、LSTM和CNN等模型在BRITE和开普勒K2数据集上的表现。研究发现LSTM不适用于此类数据,而结合特征提取与PSO超参数优化的多层感知器(MLP)在开普勒K2数据上实现了98.55%的二分类准确率。通过精细的数据预处理和高置信度样本选择,显著提升了分类性能。研究成果为恒星变异性识别提供了高效工具,并对天文学与机器学习交叉领域具有重要参考价值。

pz8901234的博客 113

swift 下标

下标可以定义在类、结构体和枚举中,是访问集合、列表或序列中元素的快捷方式。可以使用下标的索引,设置和获取值,而不需要再调用对应的存取方法。举例来说,用下标访问一个Array实例中的元素可以写作someArray[index],访问Dictionary实例中的元素可以写作someDictionary[key]。 一个类型可以定义多个下标,通过不同索引类型进行对应的重载。下标不限于一维,你可以定义具有多个入参的下标满足自定义类型的需求 定义下标使用subscript关键字,与定义实例方法...

limonero 273

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

swift 属性和下标一

1.swift属性分为存储属性和计算属性,存储属性

142

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

swift 属性和下标二

1.计算属性本身不存储数据,而是从其它存储属性中y'f

149

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Swift 系统学习 21 存储型属性和计算型属性 下标语法

//: Playground - noun: a place where people can play import UIKit /* * 本节主要内容: * 1.两种属性: 存储型属性和计算型属性 * 2.下标语法 */ struct Point2D { // 存储属性(只能存值, 没有get和set) var x = 0.0 // Double var

Clarence 344

迅捷cad_迅捷属性

迅捷cadIn this tutorial, we’ll be discussing about Swift Properties. Properties are an important part of Classes, Structures and Enumerations in Swift. 在本教程中,我们将讨论Swift属性。 属性是Swift中Class , Structures和En...

从零开始的教程世界 280

如何在Swift 4中使用String切片下标?

I have the following simple code written in Swift 3: 我有以下用Swift 3编写的简单代码: let str = "Hello, playgr

xfxf996的博客 725

swift菜鸟教程19-20(方法,下标脚本)

Swift 默认仅给方法的第一个参数名称一个局部参数名称;默认同时给第二个和后续的参数名称为全局参数名称。以下实例中 ‘no1’ 在swift中声明为局部参数名称。‘no2’ 用于全局的声明并通过外部程序访问。从方法内部改变它的属性;并且它做的任何改变在方法结束时还会保留在原始结构中。强制在第一个参数添加外部名称把这个局部名称当作外部名称使用。赋给隐含属性 self 一个全新的实例。

2301_80437645的博客 482

苹果新的编程语言 Swift 语言进阶(九)--方法和下标

一、方法      方法是与特定类型相关的函数。与属性一样,方法也包括实例方法和类型方法。      类、结构、枚举都能定义实例方法,用来封装或实现给定类型的一个实例相关的功能或特定任务。      类、结构、枚举也能定义与类型本身相关的类型方法。类型方法与Objective-C语言中的类方法相似,类型方法只能在类型本身上调用。 2.1 实例方法的定义

固弘的专栏 2251

下标的使用

类,结构和枚举类型都可以通过定义下标来访问一组或者一个序列中的成员元素。通过下标索引就可以方便地检索和设置相应的值,而不需要其他的额外操作。 比如你可以通过someArray[index]来访问数组中的元素,或者someDictionary[key]来对字典进行索引。 你可以为一个类型定义多个下标,以及适当的下标重载用来根据传递给下标的索引来设置相应的值。下标不仅可以定义为一维的,还...

bailang3277的博客 375

30天学会Swift-10:属性与方法进阶

本文介绍了Swift中的四个重要特性:延迟存储属性、类型属性、类型方法和下标。延迟存储属性(lazy)允许属性在首次使用时才初始化,适用于计算复杂或不一定会用到的属性。类型属性(static/class)属于类型本身而非实例,类型方法同理。下标(Subscripts)则可以通过索引访问集合元素,支持读写操作。文章通过代码示例展示了这些特性的具体用法,并建议实践练习来巩固学习,包括创建带延迟加载的ImageLoader类、使用类型属性和方法的AppConfiguration类等。这些特性能够提高代码的灵活性和

smileKH的博客 374

swift 下标 subscript

类、结构体、和枚举可以定义下标。它可以作为访问集合,列表或序列成员元素的快捷方式。你可以使用下标通过索引值来设置或检索值而不需要为设置和检索分别使用实例方法。 你可以作为一个类型定义多个下标,并且下标会基于传入的索引值的类型选择合适的下标重载使用,下标没有限制单个纬度,你可以使用多个输入形参来定一下标以满足自定义类型的需求。 下标脚本允许你通过在实例名后面方括号内写一个或多值对该类的实例进行查询。它的语法类似于实例方法和计算属性,使用关键字subscript来定义下标,并且指定一个或多个输入形式参数和返

丿灬安之若死 308

Swift-属性、方法、下标

存储属性和计算属性 类、结构和枚举都能够定义存储属性和计算属性。其中存储属性就是常见的形式,又分为变量属性和常量属性,如: struct Point { var x = 0.0, y = 0.0 } struct Size { var width = 0.0, height = 0.0 } 计算属性本身不是一个值,但是它提供getter和setter来间接地使用和设...

weixin_30293135的博客 95

swift基础语法(25- 下标subscripts)

subscripts(下标): 访问对象中数据的快捷方式 所谓下标脚本语法就是能够通过, 实例[索引值]来访问实例中的数据 类似于以前我们访问数字和字典, 其实Swift中的数组和字典就是一个结构体 struct Student { var name:String = "qbs" var math:Double = 99.0 var chin...

abc48765的博客 157

Swift重写属性(存储属性和计算属性)

//************重写父类的存储属性***********//class car {var name:String="b"}class trunk:car{override var name:String{get{return super.name}set{super.name= newValue}}}vartt =...

weixin_34204722的博客 724

Swift-可选链,定义?、强制展开!、定义模型类、访问属性、调用方法、访问下标、多层调用

可选链式调用是一种可以在当前值可能为 nil 的可选值上请求和调用属性、方法及下标的方法。 如果可选值有值,那么调用就会成功。 如果可选值是 nil,那么调用将返回 nil。 多个调用可以连接在一起形成一个调用链,如果其中任何一个节点为 nil,整个调用链都会失败,即返回 nil。 Swift 的可选链式调用可以应用于任意类型,并且能检查调用是否成功。 1. 使用可选链式调用代...

DevXue的博客 310
上一篇: [Swift]结构体和类的基本概念
下一篇: [Swift]方法
Lirx_Tech
博客等级 码龄12年 215粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值