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

在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
?
慕前端131612

是的,它是同this在的Java和self在Objective-C中,但斯威夫特,当你从一个封闭或您的代码(内部分化属性名称调用属性或方法的自我是只需要如初始化)。因此,除非从闭包进行调用,否则几乎可以安全地使用几乎所有类组件,而无需使用self。


“自我属性类型的每个实例都有一个称为的隐式属性self,它与实例本身完全等效。您可以使用该self属性在其自己的实例方法中引用当前实例。


increment()上面示例中的方法可能是这样编写的:


func increment() {

    self.count += 1

}

实际上,您不需要self经常编写代码。如果您未明确编写self,则Swift会假设您在方法中使用已知的属性或方法名称时,即在引用当前实例的属性或方法。通过在Counter的三个实例方法中使用count(而不是self.count)可以证明这一假设。


当实例方法的参数名称与该实例的属性名称相同时,将发生此规则的主要例外。在这种情况下,参数名称优先,因此有必要以更限定的方式引用该属性。您可以使用self属性来区分参数名称和属性名称。


在这里,可以self消除方法参数x和实例属性之间的歧义x:”


摘录自:Apple Inc.“ Swift编程语言(Swift 2预发行版)。”


这是Ray Wenderlichself在其教程中建议在Swift中使用的方式:


自我的运用

为简洁起见,请避免使用self,因为Swift不需要它访问对象的属性或调用其方法。


当需要在区分初始值设定项中的属性名称和参数以及在闭包表达式中引用属性时(如编译器要求)时,请使用self:


class BoardLocation {

  let row: Int, column: Int


  init(row: Int, column: Int) {

    self.row = row

    self.column = column


    let closure = {

      println(self.row)

    }

  }

}

这是GitHubself针对其应用程序的建议:


仅self在需要时明确引用

在访问属性或方法时self,self默认情况下将引用保留为隐式:


private class History {

    var events: [Event]


    func rewrite() {

        events = []

    }

}

仅在语言要求时(例如,在闭包中或参数名称冲突时)包括显式关键字:


extension History {

    init(events: [Event]) {

        self.events = events

    }


    var whenVictorious: () -> () {

        return {

            self.rewrite()

        }

    }

}

原理:这使捕获自我的语义在闭包中更加突出,并避免了其他地方的冗长。


查看完整回答
反对 回复 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下载
官方微信