Как решить проблему "выражение Inout создает временный указатель" в Swift 5.2?

Как мне решить эту проблему, когда я звоню CTParagraphStyleSetting работать в swift 5.2?

function myFunction() {
    var alignment: CTTextAlignment = .left
    var settings = CTParagraphStyleSetting(spec: .alignment, 
                                           valueSize: 1, 
                                           value: &alignment)
}

issue:
Inout expression creates a temporary pointer, but argument 'value' should 
be a pointer that outlives the call to 'init(spec:valueSize:value:)'

2 ответа

Решение

В отношении этого обсуждения;

https://forums.swift.org/t/swift-5-2-pointers-and-coretext/34862,

вы можете написать это так:

let alignment: CTTextAlignment = .left
let settings: CTParagraphStyleSetting = withUnsafeBytes(of: alignment) { alignment in
            CTParagraphStyleSetting(spec: .alignment, valueSize: 1, value: alignment.baseAddress!)
        }

Вот как я реализовал вышеизложенное в классе TLabel:

         let paragraphStyleSettings: [CTParagraphStyleSetting] = withUnsafeBytes(of: alignment) { alignmentBP in
        withUnsafeBytes(of: lineBreakMode, { lineBreakModeBP in
            withUnsafeBytes(of: lineSpacing, { lineSpacingBP in
                [
                    CTParagraphStyleSetting(spec: .alignment, valueSize: MemoryLayout.size(ofValue: alignment), value: alignmentBP.baseAddress!),
                    CTParagraphStyleSetting(spec: .lineBreakMode, valueSize: MemoryLayout.size(ofValue: lineBreakMode), value: lineBreakModeBP.baseAddress!),
                    CTParagraphStyleSetting(spec: .lineSpacingAdjustment, valueSize: MemoryLayout.size(ofValue: lineSpacing), value: lineSpacingBP.baseAddress!)
                ]
            })
        })
    }
Другие вопросы по тегам