我是Swift的新手,我想知道self是用来做什么的,为什么.

我在类和 struct 中见过它,但我真的觉得它们没有必要,甚至没有必要在我的代码中提到它们.它们的用途是什么?为什么?在什么情况下有必要使用它?

我已经阅读了很多关于这个问题的问题和答案,但没有一个完全回答了我的问题,他们总是倾向于将它与Java中的this个进行比较,我对Java一点都不熟悉.

推荐答案

在创建扩展时,您也会经常使用self,例如:

extension Int {
    func square() -> Int {
        return self * self
    }

    // note: when adding mutating in front of it we don't need to specify the return type
    // and instead of "return " whatever
    // we have to use "self = " whatever

    mutating func squareMe() {
        self = self * self
    }
}
let x = 3
let y = x.square()  
println(x)         // 3
printlx(y)         // 9

现在让我们假设您想要更改var结果本身

var z = 3

println(z)  // 3

现在让我们对其进行变异

z.squareMe()

println(z)  // 9

//现在让我们来看另一个使用字符串的示例:

extension String {
    func x(times:Int) -> String {
        var result = ""
        if times > 0 {
            for index in 1...times{
                result += self
            }
            return result
        }
        return ""
    }

    // note: when adding mutating in front of it we don't need to specify the return type
    // and instead of "return " whatever
    // we have to use "self = " whatever

    mutating func replicateMe(times:Int){
        if times > 1 {
            let myString = self
            for index in 1...times-1{
                self = self + myString
            }
        } else {
            if times != 1 {
                self = ""
            }
        }
    } 
}


var myString1 = "Abc"
let myString2 = myString1.x(2)

println(myString1)         // "Abc"
println(myString2)         // "AbcAbc"

现在让我们改变我的 idea

myString1.replicateMe(3)

println(myString1)         // "AbcAbcAbc"

Swift相关问答推荐

RealityKit如何获得两个相对大小相同的ModelEntity?

SWIFT中MAP的静态方法包装器

SwiftUI同心圆,通过逐渐出现来显示进度

在MacOS上检测键盘是否有Globe键

如何才能在同一线程上调用类中的每个方法,而不对每个调用使用同步块?

应该在ViewModel还是ViewController中使用"Task {}"?

从文字创建数组时的 Swift 宏

Swift Combine:如何在保留发布者结果顺序的同时进行收集?

Swift - 给定一个像 30 的 Int 如何将范围数乘以 7?

SwiftUI:当先前的视图列表更改时,NavigationView 详细视图会弹出回栈

引用类型(类)不需要但 struct 需要的可识别 id

在 Swift 中计算两个日期之间的差异

NSFontAttributeName 已更改为 String

Swift 5.0 编译器无法导入使用 Swift 4.2.1 编译的模块

如何从 Swift 中的字符串生成条形码?

在 Swift for iOS 中沿圆形路径绘制文本

如何在 Swift 中将 NSURL 转换为字符串

如何停止 NSTimer.scheduledTimerWithTimeInterval

SwiftUI:将多个 BindableObjects 放入环境

Swift3 中的 NSIndexPath 初始化有何变化?