

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

[code]

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

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

[code]

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


CC BY-SA 4.0
2019-07-11T02:57:50.863
56555
2022-08-12T07:04:05.437
2019-07-11T03:01:44.507
3060
35055
question
swift swift3 swift2
Swift3でのエラーCannot convert value of type 'UnsafePointer<xmlChar>'


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

[`init(cString:
UnsafePointer<CChar>)`](https://developer.apple.com/documentation/swift/string/1641523-init)
<\- 今のあなたのコードが使っている方

[`init(cString:
UnsafePointer<UInt8>)`](https://developer.apple.com/documentation/swift/string/2430308-init)
<\- こっちなら変換せずに使える

[code]

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

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

[code]

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

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

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


CC BY-SA 4.0
2019-07-11T10:40:13.720
56566
2019-07-11T10:40:13.720
13972
56555
answer