19879


XcodeでSwiftを使い、マップのiOSアプリを製作してます。

MapKitで地図を表示させて、その上に複数のピンを立てるつもりです。  
そのピンの位置情報なのですが、緯度、経度の情報が入力されたcsvファイル(00,0000000,000.0000000のような数字のファイル)を読み込み、String型の配列にしたうえで読み込んでいるのですが、位置情報であるCLLocationCoordinate2DMakeの読み込みにはDouble型でなければいけないようです。

そのString型の配列からDouble型の配列に変換する方法がどうしてもわかりません。

解決方法のご存知の方、どうかご教示ください。

(stringの宣言とcsvの読み込み)

[code]

      //stringの宣言
      var posionStr: [[String]] = []
    
        //csvの読み込み
        if let csvPath = NSBundle.mainBundle().pathForResource("location", ofType: "csv") {
            //初期化
            do {
                let csvString =  try NSString(contentsOfFile: csvPath, encoding: NSUTF8StringEncoding) as String
                csvString.enumerateLines{ line, stop in
                    // 行の途中に","が含まれていたら、配列の要素として切り抜く
                    let str2: [String] = line.componentsSeparatedByString(",")
                    //切り抜いた要素を追加
                    self.posionStr.append(str2)
                }
                // 何かしらのエラーがあると以下に入る
            } catch _ {
                print("何らかのエラーが発生しました")
            }
            print(posionStr)
        }
    
[/code]

(ピンの位置情報)

[code]

        locationManager = CLLocationManager()
        locationManager.delegate = self
        self.mapView.delegate = self
    
        let annotation = MKPointAnnotation()
    
       //ここで配列から緯度、経度情報を読み込みたい
        annotation.coordinate = CLLocationCoordinate2DMake(posionStr[0][1].latitude,posionStr[0][2].longitude)
        self.mapView.addAnnotation(annotation)
    
[/code]


CC BY-SA 3.0
2015-12-11T09:54:56.870
19876
2015-12-12T00:25:33.207
2015-12-11T18:28:13.897
13612
13612
question
ios swift mapkit array
String型のArrayからDouble型の配列に変換する方法

[code]

    var posionDouble = Double(posionStr[0][1])
    
[/code]

このDoubleのイニシアライザの返り値は、Optional型であることは、ごぞんじでしたか？

[code]

    var positionDuble: Double? = Double(positionStr[0][1]) // 注意。これはUnwrappingの構文じゃないよ。
    
[/code]

おそらくエラーは、非Optional型の変数に、Optional型を代入しようとしたというものだと思われます。（実行時でなく）コンパイル時のエラーだと思われますので、エラーメッセージをよく読んでください。

Optional型の変数から、値を非Optional型の変数に代入する方法は、Swiftの基礎中の基礎なので、すでに質問者さんは学習ずみのはずです。質問者さんが教科書としていた書籍なり電子ブックなりを再度読み直してください。  
いちおう代表的な方法をふたつ書いておきます。

_Forced Unwrapping_

[code]

    var positionDouble: Double = Double(positionStr[0][1])!
    
[/code]

Optional型の変数の末尾に`!`をつけると、非Optional型の値を取り出せます。

_Optional Binding_

[code]

    if var positionDouble = Double(positionStr[0][1]) {
    
    }
    
[/code]

変数positionDoubleのスコープが`{ ~ }`に限られるので、使い方が限定されます。が、Forced
Unwrappingが、もしnilの値に対して行うと、プログラムがクラッシュするのに対し、Optional
Bindingは、nilでもクラッシュしないという違いがあります。もしnilだったら、`{ ~ }`が実行されないだけです。（うしろに`else { ~
}`をつけて、nilだった場合の処理を行うこともできます。）


CC BY-SA 3.0
2015-12-11T10:24:21.030
19879
2015-12-12T00:25:33.207
2015-12-12T00:25:33.207
7362
7362
19876
answer