

Swiftでは以下のようなコードで、Float型の変数を文字列に変換できるようです。

[code]

    let testArray:[Float] = [0.1,0.2,0.3]
    var message = ""
    message.append("test-----\(testArray[0]),\(testArray[1]),\(testArray[2])|")
    
    print(message)
    
[/code]

しかし、このコードがどういう文法で動作しているのかよくわかりません。  
なぜバックスラッシュとカッコを使うことで数値を文字列に変換できるのでしょうか？

また、このコードだと、一部のデバイスでは不具合が起きたりしますでしょうか？  
今、自分の使っているコードが、一部の環境で動かないと報告を受けており  
どこに原因があるのかを探っています。  
こういった文法を使うと一部環境で動かなくなったりすることはあると思いますか？


CC BY-SA 4.0
2021-06-22T03:11:44.233
77692
2021-06-22T09:27:52.553
36446
question
swift
Swiftでバックスラッシュを使って数値を文字列に変換する文法について


> しかし、このコードがどういう文法で動作しているのかよくわかりません。

すでにコメントにリンクだけが記載されていますが、Swift本にも明記されているString Interpolation(文字列補間)と言う機能になります。

なお、まともな日本語訳が無いのは大変ハードルが高いとは思いますが、Swiftでのプログラミングをされるのであれば[Swift本](https://docs.swift.org/swift-
book/)は最低一度は目を通しておくべきでしょう。Web版の他にiBooks版もあります。

> なぜバックスラッシュとカッコを使うことで数値を文字列に変換できるのでしょうか？

そのようにSwiftコンパイラ、およびSwiftの`String`型が構成されているためです。もっと厳密に言うと、Swiftコンパイラが`"...\(...)..."`と言う文字列補間のリテラル表記を見つけると、部分ごとに分解した上で、`ExpressibleByStringInterpolation`で定義されたメソッドを呼び出す、と言う動作をするように
**Swiftコンパイラが作られています** 。

`String`型の場合、数値以外のどんな型の式を`\(...)`内に書いても、文字列に変換できたりします。(ドキュメントに明記されていない変換結果に頼るべきでは無いですが。)

> また、このコードだと、一部のデバイスでは不具合が起きたりしますでしょうか？

> こういった文法を使うと一部環境で動かなくなったりすることはあると思いますか？

上記のようにちゃんとした動作を解説すると、一冊本が書けるくらい内部的には複雑な動作をしているので、絶対に可能性が無いとは言えませんが、文字列補間自体はすべてのSwift処理系に共通な部分で処理されているため、「こういった文法を使うと一部環境で動かなくなったりする」コードをたまたま書いてしまうなんてことは、まず考えられません。

ご質問に記載された単純なケースではこれ以上何とも言えません。まずは、どう言った条件で再現する事象なのかをきちんと把握された上で、十分な情報を含めた上で再度ご質問された方が良いでしょう。私なら「こういった文法を使う」ことに直接関係しない部分で、環境依存になるようなコードを書かれていると考えて原因を探します。


CC BY-SA 4.0
2021-06-22T04:39:07.753
77693
2021-06-22T04:39:07.753
13972
77692
answer


`\()`の中の変数が、どのように文字列（String型）に変換されるかは、プロトコル`CustomStringConvertible`のプロパティ`description`で定義されます。

[CustomStringConvertible](https://developer.apple.com/documentation/swift/customstringconvertible)

[code]

    struct Hello: CustomStringConvertible {
        var name: String
        
        var description: String {
            return "Hello, " + name
        }
    }
    
    print("Say \(Hello(name: "World"))") // Say Hello, World
    
[/code]

> 今、自分の使っているコードが、一部の環境で動かないと報告を受けており どこに原因があるのかを探っています。

問題となっている変数の型が、`CustomStringConvertible`に準拠しているか、プロパティ`description`を適切に定義しているかを調べる必要があると思います。


CC BY-SA 4.0
2021-06-22T09:27:52.553
77704
2021-06-22T09:27:52.553
18540
77692
answer