Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

Hey there, it's my first time writing code in Xcode.
when I´m trying to create a QRCode-generator i get the error message "Thread 1: EXCBADINSTRUCTION (code=EXCI386INVOP, subcode=0x0)"

it would be great if someone could help me

Thanks in advice!
Code Block
//
//  QRCodeView.swift
//  QR-Generator
//
//  Created by Darvin Mng on 19.01.21.
//
import Foundation
import SwiftUI
import CoreImage.CIFilterBuiltins
struct QRCodeView : View {
    let context = CIContext()
    let filter = CIFilter.qrCodeGenerator()
    var url : String
    
    var body: some View {
        Image(uiImage : generateQRCodeImage(url: url))
            .interpolation(.none)
            .resizable().frame(width: 150, height: 150, alignment: .center)
    }
    
    func generateQRCodeImage (  url : String) -> UIImage {
        let data = Data(url.utf8)
        filter.setValue(data, forKey: "inputMessage")
        
        if let qrCodeImage = filter.outputImage {
            if context.createCGImage(qrCodeImage, from: qrCodeImage.extent) != nil {
                return UIImage(cgImage: qrCodeImage as! CGImage) Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
            }
        }
        
            return UIImage(systemName: "xmark") ?? UIImage()
    }
}

Accepted Answer
Generally, EXC_BAD_INSTRUCTION is used by Swift runtime as an intentional crash.

In the line specified, you use as!-casting, which is telling Swift compiler "Please crash my app when the type conversion is unable".
The outputImage of CIFilter is a CIImage which cannot be converted to CGImage with as-casting.

You can use UIImage(ciImage: qrCodeImage) instead of UIImage(cgImage: qrCodeImage as! CGImage), if you just need to avoid crashing here.
But if you want to get some bitmap image from the UIImage later, you may need to render the CIImage into some bitmap.
thank you!
but how do I render the CIImage into some bitmap?

but how do I render the CIImage into some bitmap?

There are many ways but the simplest way here is using createCGImage(_:from:)...
Oh, you are already using it, but disposing the result. Change your generateQRCodeImage(url:) as follows:
Code Block
func generateQRCodeImage(url : String) -> UIImage {
let data = Data(url.utf8)
filter.setValue(data, forKey: "inputMessage")
if let qrCodeImage = filter.outputImage {
if let cgImage = context.createCGImage(qrCodeImage, from: qrCodeImage.extent) {
return UIImage(cgImage: cgImage)
}
}
return UIImage(systemName: "xmark") ?? UIImage()
}

CGImage is the type to represent a bitmap based image.

Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
 
 
Q