투케이2K

145. (swift5/xcode) [deprecated 코드 대응] withUnsafeBytes is deprecated: use withUnsafeBytes<R>(...) 본문

Swift

145. (swift5/xcode) [deprecated 코드 대응] withUnsafeBytes is deprecated: use withUnsafeBytes<R>(...)

투케이2K 2023. 10. 17. 07:48

[개발 환경 설정]

개발 툴 : XCODE

개발 언어 : SWIFT5

 

[소스 코드]

 

------------------------------------------------------------------------------------------
[내용 설명]
------------------------------------------------------------------------------------------
swift 5.0 이상 버전에서 부터 withUnsafeBytes 호출 시 배열의 연속 저장소의 기본 바이트에 대한 
포인터를 사용하여 지정된 클로저를 호출 필요
------------------------------------------------------------------------------------------



------------------------------------------------------------------------------------------
[변경 코드] : [예시 - AES Crypt] : [input == Data 타입]
------------------------------------------------------------------------------------------

        // MARK: [키 생성 상태 값 지정]
        var status: CCCryptorStatus = CCCryptorStatus(kCCSuccess)

        input.withUnsafeBytes { dataBytes in
            let encryptedBytes: UnsafePointer<UInt8> = dataBytes.baseAddress!.assumingMemoryBound(to: UInt8.self)
            
            iv.withUnsafeBytes { dataBytes in
                let ivBytes: UnsafePointer<UInt8> = dataBytes.baseAddress!.assumingMemoryBound(to: UInt8.self)
                
                key.withUnsafeBytes { dataBytes in
                    let keyBytes: UnsafePointer<UInt8> = dataBytes.baseAddress!.assumingMemoryBound(to: UInt8.self)
                    status = CCCrypt(
                        operation,
                        
                        // MARK: [SecretKeySpec : 인코딩, 디코딩 수행에서 AES 지정]
                        CCAlgorithm(secretKeySpecType),
                        
                        // MARK: [Cipher : 인코딩, 디코딩 수행에서 필요한 패딩 지정]
                        CCOptions(padding),
                        
                        // MARK: [Cipher : KeySpec + iv]
                        keyBytes, // [key]
                        key.count, // [keylength]
                        
                        // MARK: [Cipher : KeySpec + iv]
                        ivBytes, // [iv]
                        
                        // MARK: [inputData]
                        encryptedBytes, // [inputData]
                        input.count, // [inputDataLength]
                        
                        // MARK: [outputData]
                        &outBytes, // [outputData]
                        outBytes.count, // [outputDataLength]
                        &outLength // [dataOutMoved]
                    )
                }
            }
        }
        guard status == kCCSuccess else {
            throw Error.cryptoFailed(status: status)
        }
        return Data(bytes: UnsafePointer<UInt8>(outBytes), count: outLength)
    }
------------------------------------------------------------------------------------------

 

반응형
Comments