2016-06-14 16 views
5

Swift 3/hinzugefügt iOS 10 einen neuen initializer auf UIImage, imageLiteralResourceName:Was ist der Unterschied zwischen UIImage (benannt :) und UIImage (imageLiteralResourceName :)?

extension UIImage { 

    required public convenience init(imageLiteralResourceName name: String) 
} 

Wie dies aus public init?(named name: String) unterscheidet sich? I named ist ein fehlender Initializer, während imageLiteralResourceName auf einen ungültigen Image-Namen abstürzt. Ist imageLiteralResourceName Handelssicherheit für die Leistung? Wann sollten Sie imageLiteralResourceName über named verwenden?

+1

Apple-Dokumente scheinen unvollständig auf [dieses Thema] (https://developer.apple.com/refere nce/uikit/uiimage/1849766-init) – Fonix

+0

Ich habe Xcode 8 noch nicht heruntergeladen, aber meine Vermutung wäre, dass 'imageLiteralResourceName' nur syntaktischer Zucker für die neuen Bildliterale ist (und man würde es nie explizit nennen). –

+0

@Fonix sieht aus, als gäbe es keinen Unterschied, siehe ['UIKit.swift'] (https://github.com/apple/swift/blob/master/stdlib/public/SDK/UIKit/UIKit.swift) – JAL

Antwort

4

am open-source implementation of UIKit Blick scheint es keinen Unterschied zu sein:

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 

Alles, was es tut, ist das Ergebnis der init(named:) kraft auszupacken.

Es scheint, als wäre es nur eine Implementierung des _ImageLiteralConvertible Protokoll in CompilerProtocols.swift gefunden:

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

AppKit auch eine ähnliche Implementierung hat:

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 

Dies könnte mit dem neuen Bild zu tun haben wörtliche Funktionalität zu Xcode 8 hinzugefügt.