スタック・オーバーフロー 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
}
}
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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP