2017-08-26 2 views
0

Dans le code ci-dessous, je suis confus quant à ce « soi » fait référence à.Dans Swift 3, quel objet ne se réfèrent à l'auto en l'occurrence

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 
} 

Je sais que je suis la mise en downloadedImage comme imageView utilisant sa propriété d'image, mais je ne sais pas pourquoi l'auto est nécessaire et ce morceau de données qu'il contient dans cette situation. Je sais que cela fait référence à une instance de la classe viewController en cours de traitement, mais est-ce que cette instance est UIImage, uploadedImage ou les données de ressource de l'image de l'exemple d'URL?

+0

Quelle classe est ce code contenu dans? – Carcigenicate

+3

Il fait référence à la classe dans laquelle ce code est. – rmaddy

+1

Probablement une copie de https://stackoverflow.com/questions/26835013/what-is-self-used-for-in-swift – rmaddy

Répondre

0

Lorsque vous appelez la fonction d'un objet (classe non statique /), vous l'appelez comme ceci:

obj.function() 

A l'intérieur de function(), self fait référence à l'objet qu'il a été appelé (si obj dans ce cas). self est comme une variable automatique que vous avez créée pour vous permettre de vous référer à la cible de l'appel de fonction.

Dans votre cas, il est assez clair que ce code est d'un ViewController de quelque sorte. Ce VC a une propriété imageView qui représente (probablement) un UIImageView dans le VC. Je devine que votre code est à l'intérieur d'une fonction qui est soit appelée par viewDidLoad (ou similaire) ou peut-être c'est la cible d'un bouton.

Lorsque ces fonctions sont appelées, self se rapportera à l'objet ViewController que la fonction a été appelée.

+0

Très bien, mais je suggère d'ajouter "Inside of function() à n'importe quelle profondeur". Mon point est que si function() appelle 'self.function2()', 'self' à l'intérieur de function2() est toujours' obj'. Et tout cela est vrai même si fonction ou fonction2 est héritée. C'est pourquoi j'ai référé le PO à une discussion sur le polymorphisme ... – matt

1

En raison de l'héritage de classe, il est impossible de savoir juste en regardant le code ce self fait référence. Tout dépend de ce que selfest lors de l'exécution.

self signifie l'instance réelle à laquelle le message a été envoyé à l'origine, mais vous n'avez même pas montré la méthode dans laquelle ce code est encapsulé, donc il n'y a même pas assez d'informations pour deviner.

Si vous avez des doutes sur ce que self est à une occasion particulière, connectez-le (avec NSLog ou print).

+1

Pourrait vous aider à lire mon explication ici: http://www.apeth.com/swiftBook/ch01.html#_self Et ici: http://www.apeth.com/swiftBook/ch04.html#_polymorphism – matt

+0

ainsi " self "crée une instance de la classe et est elle-même l'instance de la classe? C'est ce que j'ai obtenu de votre lien –

+2

Non. Self ne ** crée ** aucune instance. Self fait simplement référence à l'instance de la classe dans laquelle elle se trouve. S'il n'y a pas d'instance de cette classe, le code qui contient 'self' ne sera pas exécuté car il n'y a pas d'instance. Pensez à 'soi 'un peu comme une propriété de chaque classe qui se réfère à elle-même. Tout comme imageView est une propriété du contrôleur de vue dans ce cas. – Fogmeister