init(named:
"是明确不可继承的。public class UIImage : NSObject, NSSecureCoding, NSCoding {
public /*not inherited*/ init?(named name: String) // load from main bundle
@available(iOS 8.0, *)
public /*not inherited*/ init?(named name: String, inBundle bundle: NSBundle?, compatibleWithTraitCollection traitCollection: UITraitCollection?)
class UIImageWithName: UIImage {
var fileName: String!
func ofFile(named:String) -> UIImageWithName?{
let cgImage = UIImage(named: named)?.CGImage
if let validName = cgImage{
let image = UIImageWithName(CGImage: validName)
image.fileName = named
return image
}
return nil
}
}
不确定是否高效或有争议。请给予反馈。
class MyImage: UIImage {
convenience init?(named name: String) {
guard let image = UIImage(named: name),
let cgImage = image.cgImage else {
return nil
}
self.init(cgImage: cgImage)
}
}
named
"方法是Objective-C中的工厂方法,因此我猜想Swift中对应的init方法是为了方便而设计的。 - Michael Dautermann