2016-06-14 1 views
5

Swift 3/iOS 10 a ajouté une nouvelle initialiseur sur UIImage, imageLiteralResourceName:Quelle est la différence entre UIImage (named :) et UIImage (imageLiteralResourceName :)?

extension UIImage { 

    required public convenience init(imageLiteralResourceName name: String) 
} 

Quelle est la différence de public init?(named name: String)? I named est un initialiseur fable tandis que imageLiteralResourceName se bloque sur un nom d'image non valide. Est-ce que la sécurité commerciale imageLiteralResourceName pour la performance? Quand devriez-vous utiliser imageLiteralResourceName sur named?

+1

Les partitions de Apple semblent incomplètes sur [ce sujet] (https://developer.apple.com/refere nce/uikit/uiimage/1849766-init) – Fonix

+0

Je n'ai pas encore téléchargé Xcode 8, mais je suppose que 'imageLiteralResourceName' est juste du sucre syntaxique pour les nouveaux littéraux d'image (et vous ne l'appellerez jamais explicitement). –

+0

@Fonix ressemble à il n'y a pas de différence, voir ['UIKit.swift'] (https://github.com/apple/swift/blob/master/stdlib/public/SDK/UIKit/UIKit.swift) – JAL

Répondre

4

En regardant le open-source implementation of UIKit, il semble y avoir aucune différence:

extension UIImage : _ImageLiteralConvertible { 
    private convenience init!(failableImageLiteral name: String) { 
    self.init(named: name) 
    } 

    public required convenience init(imageLiteralResourceName name: String) { 
    self.init(failableImageLiteral: name) 
    } 
} 

public typealias _ImageLiteralType = UIImage 

Tout ce qu'il fait est force déroulez le résultat de init(named:).

Il semble que c'est juste une mise en œuvre du protocole _ImageLiteralConvertible trouvé dans CompilerProtocols.swift:

public protocol _ImageLiteralConvertible { 
    init(imageLiteralResourceName path: String) 
} 

AppKit dispose également d'une mise en œuvre similaire:

extension NSImage : _ImageLiteralConvertible { 
    private convenience init!(failableImageLiteral name: String) { 
    self.init(named: name) 
    } 

    public required convenience init(imageLiteralResourceName name: String) { 
    self.init(failableImageLiteral: name) 
    } 
} 

public typealias _ImageLiteralType = NSImage 

Cela pourrait avoir à faire avec la nouvelle image littérale fonctionnalité ajoutée à Xcode 8.