Staley Staley - 4 months ago 10
iOS Question

Cannot assign value of type '[String]' to type 'String? Swift 2

I am receiving this error message "Cannot assign value of type '[String]' to type 'String?'" associated with this line "point.title = r" and this line "point.subtitle = z". I've tried lots of things like place.description which makes the entire array a string...

//I have multiple arrays, lat, long and pass besides place.
var place = [String]()

//I have four of the chunks of code for each array
let json = try NSJSONSerialization.JSONObjectWithData(jSONData, options: .AllowFragments)
if let dataFile3 = json["data"] as? [[String: AnyObject]] {
for c in dataFile3 {
if let placeName = c["PlaceName"] {
place.append((placeName as? String)!)

for var (i,x) in zip(lat, long) {
for _ in place {
for _ in pass {
print(i)
print(x)
//print(i + ", " + x)

// String to double conversion, can I do this when I set the array as a string?
let lati = NSString(string: i).doubleValue
let longi = NSString(string: x).doubleValue


//I have a list of values array so I need to have a for loop that inputs the value over and over again.
var point = MGLPointAnnotation()
point.coordinate = CLLocationCoordinate2D(latitude: lati, longitude: longi)

point.title = place
point.subtitle = pass

mapView.addAnnotation(point)
}}}

//var i and x for loop
}

//viewDidLoad
}

//creates the markers popup for each point with data
func mapView(mapView: MGLMapView, annotationCanShowCallout annotation: MGLAnnotation) -> Bool {
// Always try to show a callout when an annotation is tapped.
return true
}


How do I fix the error above?

EDIT:
With Santosh's help this is what I changed...

let point = MGLPointAnnotation()

var i = lat
var x = long

//lat and long is served and then all the r,z points, then another lat, long...need to fix this and it may work.
for (i,x) in zip(lat, long) {
for aPlace in place {
for aPass in pass {
print(i)
print(x)

// String to double conversion, can I do this when I set the array as a string?
let lati = NSString(string: i).doubleValue
let longi = NSString(string: x).doubleValue

point.coordinate = CLLocationCoordinate2D(latitude: lati, longitude: longi)


point.title = aPlace
print(aPlace)


point.subtitle = aPass
print(aPass)

self.mapView.addAnnotation(point)
}}}


This is running correctly now or at least reporting the correct values but the loop just keeps a loopin...

Answer

Try this:

//I have four of the chunks of code for each array
    let json = try NSJSONSerialization.JSONObjectWithData(jSONData, options: .AllowFragments)
    if let dataFile3 = json["data"] as? [[String: AnyObject]] {
        for c in dataFile3 {
            if let placeName = c["PlaceName"] {
                place.append((placeName as? String)!)

                for var (i,x) in zip(lat, long) {
                    for aPlace in place {
                        for aPass in pass {
                            print(i)
                            print(x)
                            //print(i + ", " + x)

                            // String to double conversion, can I do this when I set the array as a string?
                            let lati = NSString(string: i).doubleValue
                            let longi = NSString(string: x).doubleValue


                            //I have a list of values array so I need to have a for loop that inputs the value over and over again.
                            var point = MGLPointAnnotation()
                            point.coordinate = CLLocationCoordinate2D(latitude: lati, longitude: longi)

                            point.title = aPlace
                            point.subtitle = aPass

                            mapView.addAnnotation(point)
                        }}}

                //var i and x for loop
            }

            //viewDidLoad
        }
}
Comments