我怎样才能使相同 class 的对象成为初始化程序的 return 值?
How can I make that an object of the same class become the return value of initializer?
我有这个功能:
extension UIImage {
static func from(layer: CALayer) -> UIImage? {
UIGraphicsBeginImageContext(layer.frame.size)
layer.render(in: UIGraphicsGetCurrentContext()!)
let outputImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return outputImage
}
}
怎么改成这样?
extension UIImage {
convenience init(layer: CALayer) {
self.init();
UIGraphicsBeginImageContext(layer.frame.size)
layer.render(in: UIGraphicsGetCurrentContext()!)
let outputImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self = outputImage; // Error: cannot assign to self: self is immutable
}
}
我希望 UIGraphicsGetImageFromCurrentImageContext()
的结果成为发起的 "self"。但是结果已经是UIImage
了。我不认为我应该在这个函数中使用 "mutating"?
由于错误状态 UIImage
是不可变的。您可以做的是从 outputImage 获取 CGImage
并使用 UIImage
init(cgImage: CGImage)
initializer 从中初始化一个新图像:
extension UIImage {
convenience init?(layer: CALayer) {
UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, 0)
defer { UIGraphicsEndImageContext() }
guard let context = UIGraphicsGetCurrentContext() else {
return nil
}
layer.render(in: context)
guard let outputImage = UIGraphicsGetImageFromCurrentImageContext()?.cgImage else {
return nil
}
self.init(cgImage: outputImage)
}
}
我有这个功能:
extension UIImage {
static func from(layer: CALayer) -> UIImage? {
UIGraphicsBeginImageContext(layer.frame.size)
layer.render(in: UIGraphicsGetCurrentContext()!)
let outputImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return outputImage
}
}
怎么改成这样?
extension UIImage {
convenience init(layer: CALayer) {
self.init();
UIGraphicsBeginImageContext(layer.frame.size)
layer.render(in: UIGraphicsGetCurrentContext()!)
let outputImage: UIImage? = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
self = outputImage; // Error: cannot assign to self: self is immutable
}
}
我希望 UIGraphicsGetImageFromCurrentImageContext()
的结果成为发起的 "self"。但是结果已经是UIImage
了。我不认为我应该在这个函数中使用 "mutating"?
由于错误状态 UIImage
是不可变的。您可以做的是从 outputImage 获取 CGImage
并使用 UIImage
init(cgImage: CGImage)
initializer 从中初始化一个新图像:
extension UIImage {
convenience init?(layer: CALayer) {
UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, 0)
defer { UIGraphicsEndImageContext() }
guard let context = UIGraphicsGetCurrentContext() else {
return nil
}
layer.render(in: context)
guard let outputImage = UIGraphicsGetImageFromCurrentImageContext()?.cgImage else {
return nil
}
self.init(cgImage: outputImage)
}
}