为了账号安全,请及时绑定邮箱和手机立即绑定

在Swift中,“自我”有什么用?

/ 猿问

在Swift中,“自我”有什么用?

开满天机 2019-11-18 18:15:36

我是Swift的新手,我想知道self它的用途以及原因。

我已经在类和结构中看到了它,但是我真的没有发现它们在我的代码中提到它们是必不可少的。它们的用途是什么?为什么?在什么情况下有必要使用它?

我一直在阅读很多关于这个问题的问题和答案,但是没有一个人能够完全回答我的问题,而且他们总是倾向于将其与thisJava 进行比较,对此我并不陌生。


查看完整描述

3 回答

?
慕侠2389804

创建扩展时,您还将经常使用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结果本身,则必须使用mutating func进行更改


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"

现在让我们更改myString1


myString1.replicateMe(3)


println(myString1)         // "AbcAbcAbc"


查看完整回答
反对 2019-11-18
?
慕勒3428872

我将谈论我们为什么需要self。


当我们定义一个类时,例如:


class MyClass {

    func myMethod()

}

我们正在创建一个Class Object。是的,Class也是一个对象。


然后,无论使用该类创建了多少个实例,所有实例都会有一个指向其Class Object的引用。


您可以想象该类定义的所有实例方法都在类对象中,并且它们只有一个副本。


在此处输入图片说明


这意味着使用Class创建的所有实例都共享相同的方法。


现在想象一下您是myMethod类对象中的对象,并且由于您是所有实例的共享对象,因此您必须有一种方法来告知您正在处理哪个实例。


当有人说时instance1.myMethod(),它的意思是“嗨!myMethod,请做您的工作,这instance1是您正在处理的对象”。


如何引用调用者发送给您的对象self。


如果我错了,请纠正我,谢谢。


“实际上,您不需要经常在代码中编写自我。如果您未明确编写self,那么Swift会假设您在方法中使用已知的属性或方法名称时,都在引用当前实例的属性或方法。”


摘自:Apple Inc.“快速编程语言”。iBooks。 https://itun.es/tw/jEUH0.l


查看完整回答
反对 2019-11-18

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信