#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 здесь может быть опасным.