

swiftで文字列に変数を埋め込む際、例えば

[code]

    let item = "金の剣"
    print("ゲットしたアイテムは\(item)")
    
[/code]

という感じにただ文字列に`\()`を埋め込めばいいですが、なぜかそれでは動かなく、  
`\(())` ←こういうふうに２重に囲まなければ動かなかったのですが、これはなぜでしょうか？

[code]

    import UIKit
    
    class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
    
        @IBOutlet weak var myPickerView: UIPickerView!
        let compos = [["月", "火", "水", "木", "金"], ["早朝", "午前中", "昼間", "夜間"]]
    
        func numberOfComponents(in pickerView: UIPickerView) -> Int {
            return compos.count
        }
    
        func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            let compo = compos[component]
            return compo.count
        }
    
        func pickerView(_ pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {
            if component == 0 {
                return 50
            } else {
                return 100
            }
        }
    
        func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
            let item = compos[component][row]
            return item
        }
    
        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
            //選ばれた項目
            let item = compos[component] [row]
            print("\(item)が選ばれた")
            //現在選択されている行番号
            let row1 = pickerView.selectedRow(inComponent: 0)
            let row2 = pickerView.selectedRow(inComponent: 1)
            print("現在選択されている行番号 \((row1, row2))")
    
            // 現在選択されている項目名
            let item1 = self.pickerView(pickerView, titleForRow: row1, forComponent: 0)
            let item2 = self.pickerView(pickerView, titleForRow: row2, forComponent: 1)
            print("現在選択されている項目名 \((item1!, item2!))")
            print("-------------")
    
        }
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            myPickerView.delegate = self
            myPickerView.dataSource = self
        }
    }
    
[/code]


CC BY-SA 4.0
2019-04-17T03:16:53.083
54236
2019-04-17T08:34:04.313
2019-04-17T08:34:04.313
76
31918
question
swift
swiftで文字列に変数を埋め込む際


ご質問に掲載された例はこの辺りのことでしょうか?

[code]

    print("現在選択されている行番号 \((row1, row2))")
    
[/code]

コメント中に「`\(...)`の中に式を書けば、その式の値が埋め込まれる」と書きましたが、ここでの「式」は1つの式です。

もし、`row1`と`row2`と、2つの式を埋め込みたいのであれば、本来は例えば次のようにしないといけません。

[code]

    print("現在選択されている行番号 (\(row1), \(row2))")
    
[/code]

2つの値を埋め込んでいるのだから、`\(...)`も2ついるわけです。

だのに、あなたのコードが正しく動くのは`(..., ...)`が[タプル(tuple)](https://docs.swift.org/swift-
book/LanguageGuide/TheBasics.html#ID329)になっているからです。タブルは1つの式なので、`\(...)`の中に埋め込むことにより埋め込み文字列中で使えているわけです。

* * *

似たような(見た目上は)二重のカッコは、関数呼び出しの際にも発生し得ます。

[code]

    func myFunc(_ tuple: (Int, Int)) {
        print("tuple=\(tuple)")
    }
    myFunc((1, 2)) //->tuple=(1, 2)
    myFunc(1, 2) //->Global function 'myFunc' expects a single parameter of type '(Int, Int)'
    
[/code]

(外側の`myFunc(...)`の方が関数呼び出しとしてのカッコ、内側の`(1, 2)`がタプルを作るためのカッコです。)

このように見た目が「二重のカッコ」になる例はちょくちょくあるのに、コードをお示しいただくまで気づかなかったはお恥ずかしい限りですが、1つの式としてタプルを使うと言う感覚はわかっていただけたのではないかと思います。

(ちなみに`myFunc(1, 2)`のような呼び出し方は、昔のSwiftでは許可されていたので、さらにややこしかったです。)

* * *

ちなみに \ を含むコードを本文中に入れたい場合、バッククオートで囲んで`...`のようにしてやるとうまくいくときがあります。(\
は引用文字なんでうまくいかない時もあります。)またコードブロック全体をコード引用するときは先頭と最後に ```
(バッククオート3つ)だけの行を置いてやると囲まれた全体がコードとして成形されるようになります。ご参考までに。


CC BY-SA 4.0
2019-04-17T05:33:18.463
54241
2019-04-17T05:33:18.463
13972
54236
answer