Не удается преобразовать значение типа ‘[String]’ в тип ‘NSString’ при принуждении

#arrays #swift #string

#массивы #swift #строка

Вопрос:

У меня есть строка, которая выводит:

 LATITUDE = [String]()
LATITUDE = ["41.87194", "33.4941704", "46.8796822", "31.9685988", "45.253783"]
var custlatt = (LATITUDE as NSString).doubleValue
 

Я пытаюсь вставить координаты широты в приведенный ниже код:

 var markerDict: [Int: GMSMarker] = [:]
for i in 0...(POST_COUNT - 1){
                markerDict[i] = GMSMarker()
                markerDict[i]?.position = CLLocationCoordinate2D(latitude:custlatt[i], longitude: custlong[i])
                markerDict[i]?.title = ""
                markerDict[i]?.icon = UIImage(named: "Pin Red Small")
                markerDict[i]?.snippet = ""
                markerDict[i]?.map = mapView
 

для var custlatt я получаю сообщение об ошибке «Не удается преобразовать значение типа ‘[String]’ в тип ‘NSString’ при принуждении»

любая помощь приветствуется, я новичок в swift, и я застрял довольно долго. заранее спасибо!

Комментарии:

1. Если вы не распознаете массив, я бы посоветовал вам сделать перерыв в кодировании и прочитать первые 5 или 6 глав книги по языку программирования Swift , чтобы вы изучили основы.

Ответ №1:

Вы не можете принудительно преобразовать массив к одному значению. Но, согласно коду, это все равно не то, что вы хотите.

Мост, приведенный NSString для преобразования String в Double , не работает

Собственный быстрый способ преобразования массива строк в массив двойных значений

 let stringLatitudes = ["41.87194", "33.4941704", "46.8796822", "31.9685988", "45.253783"]
let latitudes = stringLatitudes.compactMap(Double.init)
 

И цикл for также является objective-c. В Swift есть полуоткрытый оператор диапазона ( ..< ), который позволяет избежать -1 вычитания.

 for i in 0..<postCount { ...
 

Примечание: Пожалуйста, назовите переменные в нижнем регистре в соответствии с соглашением об именовании

Комментарии:

1. Обратите внимание, что существует 2 массива, а также цикл for от 0 до PostCount, поэтому compactMap это может действительно все испортить

2. @JoakimDanielson Да, но поскольку строковые массивы кажутся литералами, сбой вне диапазона выявит ошибку проектирования.

3. @vadian Большое вам спасибо за ответ, который решил обе проблемы. Я все еще учусь, и я так долго зацикливался на этом. Еще раз спасибо!

Ответ №2:

Вам нужно выполнить приведение внутри цикла for, вы не можете преобразовать an Array<String> в an NSString .

Кроме того, преобразование a String в a Double должно выполняться не через NSString , а через Double инициализатор.

Вы также должны соблюдать соглашение об именовании Swift, которое используется в нижнем регистре для имен переменных.

 let latitudes = ["41.87194", "33.4941704", "46.8796822", "31.9685988", "45.253783"].compactMap { Double($0) }
let longitudes = ["42", "33", "23", "45", "6"].compactMap { Double($0) } 

var markerDict: [Int: GMSMarker] = [:]
for i in 0..<postCount {
    let marker = GMSMarker()
    market = GMSMarker()
    marker.position = CLLocationCoordinate2D(latitude:latitudes[i], longitude: longitudes[i])
    marker.title = ""
    marker.icon = UIImage(named: "Pin Red Small")
    marker.snippet = ""
    marker.map = mapView
    markerDict[i] = marker
}
 

Комментарии:

1. 0..<postCount - 1 должно быть 0..<postCount

2. Смотрите мой комментарий к ответу вадиана, compactMap здесь может быть опасным.