TransWikia.com

Swift3でのエラーCannot convert value of type 'UnsafePointer'

スタック・オーバーフロー Asked by Yoohee on December 5, 2020

Swift2からSwift3へのConvertを行なったところ、以下のエラーが出て解決できません。

Cannot convert value of type 'UnsafePointer<xmlChar>' (aka 'UnsafePointer<UInt8>') to expected argument type 'UnsafePointer<_>'

該当コードは以下の通りです。String(cString: UnsafePointer<CChar>(char!))のところでエラーが出ます。

static func fromXmlChar(_ char: UnsafePointer<xmlChar>?) -> String? {
    if char != nil {
        return String(cString: UnsafePointer<CChar>(char!))
    } else {
        return nil
    }
}

One Answer

Swift3コンパイラを搭載したバージョンのXcodeは、かなり昔に捨ててしまったので、Xcode 9.4.1のSwift 3.3モードでテストしただけですが、Swift 3では、2種類のString.init(cString:)が定義されていたはずですので、不要なポインタ変換(Swift 3ではご質問に記載UnsafePointer<CChar>(...)のようなイニシャライザ構文では、ポインタ型間の変換はできなくなりました)を削除してやれば、コンパイルは通るはずです。

init(cString: UnsafePointer<CChar>) <- 今のあなたのコードが使っている方

init(cString: UnsafePointer<UInt8>) <- こっちなら変換せずに使える

    static func fromXmlChar(_ char: UnsafePointer<xmlChar>?) -> String? {
        if char != nil {
            return String(cString: char!) //<- 変換せずに直接`UnsafePointer<xmlChar>`を渡す
        } else {
            return nil
        }
    }

あるいは、条件付きバインディングを使った方がよりSwiftっぽくなります。

    static func fromXmlChar(_ char: UnsafePointer<xmlChar>?) -> String? {
        if let cStr = char {
            return String(cString: cStr)
        } else {
            return nil
        }
    }

今後、Swift 4, Swift 5への変換をすぐに行われるかどうかわかりませんが、あちこちを可能な限りSwiftっぽく書いておいた方が、変換に成功する確率が高くなる傾向があります。

なお、Swift 3コンパイラではコンパイルできないコードでもSwift 4コンパイラのSwift 3.3モードではコンパイル出来てしまう場合があります。上記のコードがあなたのお手持ちのXcodeでコンパイルできない場合は、お知らせ下さい。

Answered by OOPer on December 5, 2020

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP