【问题标题】:In Swift 3, what object does self refer to in this instance在 Swift 3 中,在这个实例中 self 指的是什么对象
【发布时间】:2017-08-26 23:23:06
【问题描述】:

在下面的代码中,我对“self”实际上指的是什么感到困惑。

let imageURL = URL(string : “http://exampleURLh.jpg”)!
let task=imageDataURLSession.sharedSession().dataTaskWithURL(imageURL, {(data, response, error) in
    print (“task finished”)
}
task.resume()
if error == nil {
    let downloadedImage = UIImage(data: data!)

    self.imageView.image = downloadedImage
}

我知道我正在使用它的 image 属性将下载的Image 设置为 imageView,但我不确定为什么需要 self 以及在这种情况下它包含哪些数据。我知道它指的是正在处理的 viewController 类的实例,但该实例是 UIImage、downloadedImage 还是示例 URL 中图像的资源数据?

【问题讨论】:

  • 这段代码包含在什么类中?
  • 它指的是这段代码所在的任何类。
  • 它在视图控制器内部的 .viewDidLoad 函数中。
  • 你的问题没什么意义。 self 是您所说的视图控制器的实例。就是这样,没有别的了。 self.imageView 指的是视图控制器的imageView 属性。

标签: swift self


【解决方案1】:

由于类继承,不可能只看代码就知道self指的是什么。这完全取决于运行时self 是 是什么。

self 表示消息最初发送到的实际实例,但是您甚至没有显示包装此代码的方法,因此甚至没有足够的信息来猜测。

如果您在某些特定场合对 self 是什么有疑问,请记录下来(使用 NSLog 或 print)。

【讨论】:

  • 可能会帮助你在这里阅读我的解释:apeth.com/swiftBook/ch01.html#_self 在这里:apeth.com/swiftBook/ch04.html#_polymorphism
  • 所以“self”创建了一个类的实例,它本身就是这个类的实例吗?这就是我从你的链接得到的
  • 没有。 Self 不创建任何实例。 Self 只是指它所在范围内的类的实例。如果没有该类的实例,则包含self 的代码将不会运行,因为没有实例。想想self 有点像每个类的属性,它引用自己。就像在这种情况下 imageView 是视图控制器的属性一样。
  • 当一个人说“我的名字是 Fogmeister”时,没有另一个人被克隆。 “我的”这个词是指说那个词的人的例子。如果这有意义的话。
【解决方案2】:

当你调用一个对象的(非静态/类)函数时,你可以这样调用它:

obj.function()

在function() 内部,self 指的是它被调用的对象(在这种情况下是obj)。 self 就像一个自动变量,你可以方便地引用函数调用的目标。

在您的情况下,很明显这段代码来自某种 ViewController。该 VC 有一个 imageView 属性,它代表(可能)VC 中的UIImageView。我猜你的代码在一个由viewDidLoad(或类似的)调用的函数中,或者它可能是一个按钮点击的目标。

当调用这些函数时,self 将引用调用该函数的 ViewController 对象。

【讨论】:

  • 非常好,但我建议添加“函数内部任意深度”。我的观点是,如果 function() 调用 self.function2(),则 function2() 内部的 self 仍然是 obj。所有这一切都是真实的即使函数或函数2 被继承。这就是为什么我将 OP 提到多态性的讨论......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多