2016-06-14 27 views
5

Swift 3/iOS 10 ha aggiunto una nuova inizializzatore su UIImage, imageLiteralResourceName:Qual è la differenza tra UIImage (named :) e UIImage (imageLiteralResourceName :)?

extension UIImage { 

    required public convenience init(imageLiteralResourceName name: String) 
} 

Come funziona questo differiscono da public init?(named name: String)? I named è un inizializzatore disponibile mentre imageLiteralResourceName si arresta in modo anomalo su un nome immagine non valido. imageLiteralResourceName sicurezza commerciale per le prestazioni? Quando si dovrebbe usare imageLiteralResourceName su named?

+1

i documenti Apple sembrano incompleti su [questo argomento] (https://developer.apple.com/refere nce/uikit/uiimage/1849766-init) – Fonix

+0

Non ho ancora scaricato Xcode 8, ma suppongo che 'imageLiteralResourceName' sia solo zucchero sintattico per i nuovi valori letterali di immagine (e non lo chiameresti mai esplicitamente). –

+0

@Fonix sembra che non ci siano differenze, vedere ['UIKit.swift'] (https://github.com/apple/swift/blob/master/stdlib/public/SDK/UIKit/UIKit.swift) – JAL

risposta

4

Guardando il open-source implementation of UIKit, non sembra esserci alcuna differenza:

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 

Tutto ciò che fa è la forza-scartare il risultato di init(named:).

Sembra come se fosse solo un'implementazione del protocollo _ImageLiteralConvertible trovata in CompilerProtocols.swift:

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

AppKit ha anche una simile implementazione:

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 

questo potrebbe avere a che fare con la nuova immagine letterale funzionalità aggiunta a Xcode 8.