Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.

Json parse to struct

0 oy
714 kez görüntülendi
22, Haziran, 2017 ios development kategorisinde csayin tarafından soruldu
22, Haziran, 2017 csayin tarafından düzenlendi

Merhabalar herkese json'dan gelen veriyi bir struct'ın içine parse etmeye çalışıyorum. Json bu fonksiyon ile başarılı bir şekilde geliyor ve print(responSting)'de eksiksiz yazdırılıyor;

func getSales(authorization:String) {

    let url = NSURL(string: "http://api.xxx.com/satislar")

    let request = NSMutableURLRequest(url: url! as URL)

    request.httpMethod = "GET"

    request.addValue(authorization, forHTTPHeaderField: "Authorization")

    let task = URLSession.shared.dataTask(with: request as URLRequest) { data,response,error in

    guard error == nil && data != nil else {
        print("error", error!)
        return
    }

    let httpStatus = response as? HTTPURLResponse

    if httpStatus!.statusCode == 200 {
        if data?.count != 0 {
            let responString = try! JSONSerialization.jsonObject(with: data!, options: .allowFragments) as? NSArray

                    print(responString!, "get sales successful") //buraya kadar tamam

            DispatchQueue.main.async {
                //self.tableView.reloadData()
            }
        } else {
            print("No got data from URL")
        }
    } else { 
        print("error httpstatus code is ", httpStatus!.statusCode)
    }
}
task.resume()
}

böyle bir struct yapısı kurdum;

struct SalesStruct {

    var id:Int
    var name:String
    var date:String
    var product:String
    var price:String
    init(productDetails:[String:String]) {
        self.id = Int(productDetails["REFID"]!) ?? 0
        self.name = productDetails["CAD"]!
        self.date = productDetails["ISLEMTARIHI"]!
        self.product = productDetails["PAKET"]!
        self.price = productDetails["TUTAR"]!
    }
}

şu sekilde de viewcontroller da tanımladım;

var salesDataStack:[SalesStruct] = []

bu da json'dan gelen datanın bir kısmı;

(
        {
        REFID=1
        CAD = "company name";
        ISLEMTARIHI = "11.06.2017";
        PAKET = "product";
        TUTAR = "550,20 $";
    },
{
         REFID=1
        CAD = "company name2";
        ISLEMTARIHI = "16.06.2017";
        PAKET = "product";
        TUTAR = "220,20 $";
    }
)

print(responString!, "get sales successful") dan sonra islemleri yapmam gerek düşüncesiye alttaki 2 örneği denedim ancak sonuca varamadım;

for temp in responString! {
        self.salesDataStack.append(SalesStruct(productDetails: temp as! [String : String]))
}

for temp in responString! {
        let product = SalesStruct(productDetails: temp as! [String : String])
        self.salesDataStack.append(product)
}
23, Haziran, 2017 csayin tarafından yorumlandı

//fonksiyon
func getIpBasedLocationData(authorization:String, completionHandler:@escaping ([IPBasedLocationData]?) -> Void) {
//authorization:String'i ekledim
if let myUrl = URL(string: "http://api.nilvera.com/satislar") {
var request = URLRequest(url: myUrl)
request.httpMethod = "GET"
request.addValue(authorization, forHTTPHeaderField: "Authorization") //token elemanlarini ekledim
URLSession.shared.dataTask(with: request, completionHandler: { (data:Data?, response:URLResponse?, error:Error?) in
if error == nil {
if let httpResponse = response as? HTTPURLResponse {
if httpResponse.statusCode == 200 {
if let receivedData = data {
do {
let jsonObject = try JSONSerialization.jsonObject(with: receivedData, options: .allowFragments)

                                //print(jsonObject)//json basarili

                                if let array = jsonObject as? [[String:Any]] {
                                    var returningData:[IPBasedLocationData] = []
                                    for part in array {

                                        var dataPart = IPBasedLocationData()

                                        if let salesName = part["CAD"] {
                                            if let salesNameInString = salesName as? String {
                                                dataPart.name = salesNameInString
                                            }
                                        }
                                        if let salesId = part["REFID"] {
                                            if let salesIdInt = salesId as? Int {
                                                dataPart.id = salesIdInt
                                            }
                                        }

                                        if let salesDate = part["ISLEMTARIHI"]{
                                            if let salesDateInString = salesDate as? String{
                                                dataPart.date = salesDateInString
                                            }
                                        }
                                        if let salesProduct = part["PAKET"]{
                                            if let salesProductInString = salesProduct as? String{
                                                dataPart.product = salesProductInString
                                            }
                                        }
                                        if let salesPrice = part["TUTAR"]{
                                            if let salesPriceInString = salesPrice as? String{
                                                dataPart.price = salesPriceInString
                                            }
                                        }
                                        returningData.append(dataPart)
                                    }

                                    completionHandler(returningData)
                                } else {
                                    completionHandler(nil)
                                }
                            } catch let jsonError {
                                print("jsonError:\(jsonError.localizedDescription)")
                                completionHandler(nil)
                            }
                        } else {
                            print("there is no recevied data")
                            completionHandler(nil)
                        }
                    } else {
                        print("invalid response:\(httpResponse.statusCode)")
                        completionHandler(nil)
                    }
                } else {
                    completionHandler(nil)
                }
            } else {
                print("request error:\(String(describing: error?.localizedDescription))")
                completionHandler(nil)
            }
        }).resume()
    } else {
        completionHandler(nil)
    }
}

uygun yerde bu sekilde çağırıyoruz;

getIpBasedLocationData(authorization: strTokenType2+" "+strAccessToken) { (locationData:[IPBasedLocationData]?) in

            DispatchQueue.main.async {
                if let receivedLocationData = locationData {
                    for dataPart in receivedLocationData {
                        if let salesName = dataPart.name{
                            print("adi: \(salesName)")
                        }
                        if let salesDate = dataPart.date{
                            print("tarih: \(salesDate)")
                        }
                        if let salesProduct = dataPart.product{
                            print("paket: \(salesProduct)")
                        }
                        if let salesPrice = dataPart.price{
                            print("tutar: \(salesPrice)")
                        }
                        if let salesId = dataPart.id{
                            print("id: \(salesId)")
                        }

                        self.salesDataStack.append(dataPart)

                    }


                } else {
                    print("no location data received")
                }

                self.tableView.reloadData()
                self.activityIndicator.stopAnimating()
                UIApplication.shared.endIgnoringInteractionEvents()
            }

        }

1 cevap

0 oy
22, Haziran, 2017 yasin tarafından cevaplandı
23, Haziran, 2017 csayin tarafından seçilmiş
 
En İyi Cevap

uygulama çöküyor mu?

22, Haziran, 2017 csayin tarafından yorumlandı

evet ekteki gibi çöküyor.

22, Haziran, 2017 yasin tarafından yorumlandı

çünkü ecnebilerin dediği gibi son derece "error-prone" olmuş.
:)
struct'a gönderilen array key'lerinin tutarlılığından hiç bir zaman emin olunamaz, keza hepsinin sonuna ünlem işaretini koydurmuş sana dikkat edersen.
bir array içierisindeki elemanlar her zaman optional'dır.
yar optional closure kullan,
ya guard,
ya da struct elemanlarına default değerler ver.

22, Haziran, 2017 csayin tarafından yorumlandı

struct SalesData {

var id:Int?
var name:String?
var date:String?
var product:String?
var price:String?
init(productDetails:[String:String]) {
    self.id = Int(productDetails["REFID"]!) ?? 0
    self.name = productDetails["CAD"]
    self.date = productDetails["ISLEMTARIHI"]
    self.product = productDetails["PAKET"]
    self.price = productDetails["TUTAR"]
}

}

struct degerleri bu şekilde optional yapmayı denedim ama "let product = SalesStruct(productDetails: temp as! [String : String])
" satırında çökme devam ediyor. Acaba ben mi optional closure kullanımında sizinle mutabık olamadım?

22, Haziran, 2017 yasin tarafından yorumlandı

array elemanları için optional closure kullan demek istedim.

struct SalesStruct {    
    var id:Int
    var name:String
    var date:String
    var product:String
    var price:String
    init(productDetails:[String:String]) {
        var safeId:Int = 0
        var safeCad:String = ""
        var safeIslemTarihi:String = ""
        var safePaket:String = ""
        var safeTutar:String = ""
        if let idInString = productDetails["REFID"] {
            if let idInInt = Int(idInString) {
                safeId = idInInt
            }
        }
        if let cadInString = productDetails["CAD"] {
            safeCad = cadInString
        }
        if let islemTarihiInString = productDetails["ISLEMTARIHI"] {
            safeIslemTarihi = islemTarihiInString
        }
        if let paketInString = productDetails["PAKET"] {
            safePaket = paketInString
        }
        if let tutarInString = productDetails["TUTAR"] {
            safeTutar = tutarInString
        }
        self.id = safeId
        self.name = safeCad
        self.date = safeIslemTarihi
        self.product = safePaket
        self.price = safeTutar
    }
}
22, Haziran, 2017 csayin tarafından yorumlandı

verdiğiniz struct yapısını birebir uyguladım Yasin hocam ama hala çökme devam ediyor. breakpoint koyarak inceledim ama çözüme ulaşamadım hala durum ekteki gibi maalesef

22, Haziran, 2017 yasin tarafından yorumlandı

paylaştığın ekran görüntüsünde struct'a gönderdiğin temp, [String:String] array'a çevrilemiyor o zaman.
o nu da bir optional closure içine al bakalım o halde.
Şöyle;

if let isStringString = temp as? [String:String] {
     let product = SalesData(productDetails: isStringString)
     self.salesDataStruct.append(product)
} else {
     print("temp is a different kind of object")
}
22, Haziran, 2017 csayin tarafından yorumlandı

sorun "temp as? [String:String]" da galiba direkt else metoduna giriyor.

22, Haziran, 2017 yasin tarafından yorumlandı

senin şu json parse yapında bir sıkıntı var anlaşılan.

nasıl error-safe bir şekilde json datasını çekip parse edileceğini gösteren bir örnek hazırladım.

örnek'de, https://freegeoip.net/json/ adresinden dönen json datasını parse ediyor ve konsola yazdırıyoruz.

öncelikle, bu adresin verdiği data type'lara göre bir struct kuralım

struct IPBasedLocationData {
    var ip:String!
    var countryCode:String!
    var countryName:String!
    var regionCode:String!
    var regionName:String!
    var city:String!
    var zipCode:String!
    var timeZone:String!
    var latitude:Double!
    var longitude:Double!
    var metroCode:Int!
}
22, Haziran, 2017 yasin tarafından yorumlandı

daha sonra da bu adrese GET requestinde bulunacak completionHandler'li bir metod hazırlayalım.

func getIpBasedLocationData(completionHandler:@escaping (IPBasedLocationData?) -> Void) {
        if let myUrl = URL(string: "https://freegeoip.net/json/") {
            var request = URLRequest(url: myUrl)
            request.httpMethod = "GET"
            URLSession.shared.dataTask(with: request, completionHandler: { (data:Data?, response:URLResponse?, error:Error?) in
                if error == nil {
                    if let httpResponse = response as? HTTPURLResponse {
                        if httpResponse.statusCode == 200 {
                            if let receivedData = data {
                                do {
                                    let jsonObject = try JSONSerialization.jsonObject(with: receivedData, options: .allowFragments)
                                    if let array = jsonObject as? [String:Any] {
                                        var returningData = IPBasedLocationData()
                                        if let ip = array["ip"] {
                                            if let ipInString = ip as? String {
                                                returningData.ip = ipInString
                                            }
                                        }
                                        if let countryCode = array["country_code"] {
                                            if let countryCodeInString = countryCode as? String {
                                                returningData.countryCode = countryCodeInString
                                            }
                                        }
                                        if let countryName = array["country_name"] {
                                            if let countryNameInString = countryName as? String {
                                                returningData.countryName = countryNameInString
                                            }
                                        }
                                        if let regionCode = array["region_code"] {
                                            if let regionCodeInString = regionCode as? String {
                                                returningData.regionCode = regionCodeInString
                                            }
                                        }
                                        if let regionName = array["region_name"] {
                                            if let regionNameInString = regionName as? String {
                                                returningData.regionName = regionNameInString
                                            }
                                        }
                                        if let city = array["city"] {
                                            if let cityInString = city as? String {
                                                returningData.city = cityInString
                                            }
                                        }
                                        if let zipCode = array["zip_code"] {
                                            if let zipCodeInString = zipCode as? String {
                                                returningData.zipCode = zipCodeInString
                                            }
                                        }
                                        if let timeZone = array["time_zone"] {
                                            if let timeZoneInString = timeZone as? String {
                                                returningData.timeZone = timeZoneInString
                                            }
                                        }
                                        if let latitude = array["latitude"] {
                                            if let latitudeInDouble = latitude as? Double {
                                                returningData.latitude = latitudeInDouble
                                            }
                                        }
                                        if let longitude = array["longitude"] {
                                            if let longitudeInDouble = longitude as? Double {
                                                returningData.longitude = longitudeInDouble
                                            }
                                        }
                                        if let metroCode = array["metro_code"] {
                                            if let metroCodeInInt = metroCode as? Int {
                                                returningData.metroCode = metroCodeInInt
                                            }
                                        }
                                        completionHandler(returningData)
                                    } else {
                                        completionHandler(nil)
                                    }
                                } catch let jsonError {
                                    print("jsonError:\(jsonError.localizedDescription)")
                                    completionHandler(nil)
                                }
                            } else {
                                print("there is no recevied data")
                                completionHandler(nil)
                            }
                        } else {
                            print("invalid response:\(httpResponse.statusCode)")
                            completionHandler(nil)
                        }
                    } else {
                        completionHandler(nil)
                    }
                } else {
                    print("request error:\(String(describing: error?.localizedDescription))")
                    completionHandler(nil)
                }
            }).resume()
        } else {
            completionHandler(nil)
        }
    }
22, Haziran, 2017 yasin tarafından yorumlandı

ve son olarak bu metodu nasıl thread safe bir şekilde kullanacağımızı da şurada görebilirsin.

getIpBasedLocationData { (locationData:IPBasedLocationData?) in
            DispatchQueue.main.async {
                if let receivedLocationData = locationData {
                    if let ip = receivedLocationData.ip {
                        print("ip: \(ip)")
                    }
                    if let countryCode = receivedLocationData.countryCode {
                        print("countryCode: \(countryCode)")
                    }
                    if let countryName = receivedLocationData.countryName {
                        print("countryName: \(countryName)")
                    }
                    if let regionCode = receivedLocationData.regionCode {
                        print("regionCode: \(regionCode)")
                    }
                    if let regionName = receivedLocationData.regionName {
                        print("regionName: \(regionName)")
                    }
                    if let city = receivedLocationData.city {
                        print("city: \(city)")
                    }
                    if let zipCode = receivedLocationData.zipCode {
                        print("zipCode: \(zipCode)")
                    }
                    if let timeZone = receivedLocationData.timeZone {
                        print("timeZone: \(timeZone)")
                    }
                    if let latitude = receivedLocationData.latitude {
                        print("latitude: \(latitude)")
                    }
                    if let longitude = receivedLocationData.longitude {
                        print("longitude: \(longitude)")
                    }
                    if let metroCode = receivedLocationData.metroCode {
                        print("metroCode: \(metroCode)")
                    }
                } else {
                    print("no location data received")
                }
            }
        }
22, Haziran, 2017 csayin tarafından yorumlandı

Hocam fonksiyonu şu şekilde düzenledim;

func getIpBasedLocationData(authorization:String, completionHandler:@escaping (IPBasedLocationData?) -> Void) {
    //authorization:String'i ekledim
    if let myUrl = URL(string: "http://api.xxx.com/satislar") {
        var request = URLRequest(url: myUrl)
        request.httpMethod = "GET"
        request.addValue(authorization, forHTTPHeaderField: "Authorization") //token elemanlarini ekledim
        URLSession.shared.dataTask(with: request, completionHandler: { (data:Data?, response:URLResponse?, error:Error?) in
            if error == nil {
                if let httpResponse = response as? HTTPURLResponse {
                    if httpResponse.statusCode == 200 {
                        if let receivedData = data {
                            do {
                                let jsonObject = try JSONSerialization.jsonObject(with: receivedData, options: .allowFragments)

                                print(jsonObject)//json basarili

                                if let array = jsonObject as? [String:Any] {
                                    var returningData = IPBasedLocationData()

                                    if let salesName = array["CAD"] {
                                        if let salesNameInString = salesName as? String {
                                            returningData.name = salesNameInString
                                        }
                                    }
                                    if let salesId = array["REFID"] {
                                        if let salesIdInt = salesId as? Int {
                                            returningData.id = salesIdInt
                                        }
                                    }

                                    if let salesDate = array["ISLEMTARIHI"]{
                                        if let salesDateInString = salesDate as? String{
                                            returningData.date = salesDateInString
                                        }
                                    }
                                    if let salesProduct = array["PAKET"]{
                                        if let salesProductInString = salesProduct as? String{
                                            returningData.product = salesProductInString
                                        }
                                    }
                                    if let salesPrice = array["TUTAR"]{
                                        if let salesPriceInString = salesPrice as? String{
                                            returningData.price = salesPriceInString
                                        }
                                    }

                                    completionHandler(returningData)
                                } else {
                                    completionHandler(nil)
                                }
                            } catch let jsonError {
                                print("jsonError:\(jsonError.localizedDescription)")
                                completionHandler(nil)
                            }
                        } else {
                            print("there is no recevied data")
                            completionHandler(nil)
                        }
                    } else {
                        print("invalid response:\(httpResponse.statusCode)")
                        completionHandler(nil)
                    }
                } else {
                    completionHandler(nil)
                }
            } else {
                print("request error:\(String(describing: error?.localizedDescription))")
                completionHandler(nil)
            }
        }).resume()
    } else {
        completionHandler(nil)
    }
}

Kullanıcı girişi olduğu için bazı gerekli eklemeleri yaptım. Jsondan datayı başarılı bir şekilde aldım. ve fonksiyonu viewDidLoad'da bu şekilde çağırdım;

getIpBasedLocationData(authorization: strTokenType2+" "+strAccessToken) { (locationData:IPBasedLocationData?) in
            DispatchQueue.main.async {
                if let receivedLocationData = locationData {

                    if let salesName = receivedLocationData.name{
                        print("adi: \(salesName)")
                    }
                    if let salesDate = receivedLocationData.date{
                        print("tarih: \(salesDate)")
                    }
                    if let salesProduct = receivedLocationData.product{
                        print("paket: \(salesProduct)")
                    }
                    if let salesPrice = receivedLocationData.price{
                        print("tutar: \(salesPrice)")
                    }
                    if let salesId = receivedLocationData.id{
                        print("id: \(salesId)")
                    }

                } else {
                    print("no location data received")
                }
            }
        }

        print(IPBasedLocationData(), "!burasi!")

Ancak gelen datayı struct'a yollayamadım çünkü;

} else {
              print("no location data received")
}

methodu çalışıyor ve print(IPBasedLocationData())'in sonucu terminalde;

IPBasedLocationData(id: nil, name: nil, date: nil, product: nil,
price: nil)

olarak geliyor. "if let array = jsonObject as? [String:Any]" den itibaren datayi yollamıyorum bir kaç evirdim çevirdim ama olmadı.

23, Haziran, 2017 yasin tarafından yorumlandı

eğer "no location data received" geliyorsa,
öncesinde getIpBasedLocationData metodu içerisinde "completionHandler(nil)" dönüyor demektir.
getIpBasedLocationData metodu içerisinde tüm "completionHandler(nil)"'lere print koy bakalım. Zaten çoğunda açıklama koymuştum verdiğim örnekde, bir kaç tanesinde yok ama.
oralarada print koy ve logları takip et, bakalım nerede kalıyor.

23, Haziran, 2017 csayin tarafından yorumlandı

completionHandler(returningData)'a breakpoint koydum. buraya girmeden hemen bi alt satırdaki else metodunun içindeki;

else {
            print(jsonObject) // Json data başarılı
            completionHandler(nil)
}

metodundaki "completionHandler(nil)"i çalıstırıp no location data received'ı döndürüyor

23, Haziran, 2017 yasin tarafından yorumlandı

sunucudan gelen json [String:Any]'e çevrilemiyor anlaşılan.
json yapısı nasıl, paylaşabilirsen bi bakalım.

23, Haziran, 2017 csayin tarafından yorumlandı

Postman çıktısı bu şekilde;

[
{
REFID=1001
CAD = "company name";
ISLEMTARIHI = "11.06.2017";
PAKET = "product1";
TUTAR = "550,00 $";
}, {
REFID=1004
CAD = "company name2";
ISLEMTARIHI = "16.06.2017";
PAKET = "produc3t";
TUTAR = "200,00 $";
}, {
REFID=1009
CAD = "company name2";
ISLEMTARIHI = "18.06.2017";
PAKET = "product2";
TUTAR = “140,00 $";
} ]

23, Haziran, 2017 yasin tarafından yorumlandı

hımm, nested json array dönüyormuş.
o zaman şöyle olmalı,

 if let array = jsonObject as? [[String:Any]] {
        for part in array {

        }
}

yani metod şöyle olmalı kısacası,

func getIpBasedLocationData(authorization:String, completionHandler:@escaping ([IPBasedLocationData]?) -> Void) {
        //authorization:String'i ekledim
        if let myUrl = URL(string: "http://api.xxx.com/satislar") {
            var request = URLRequest(url: myUrl)
            request.httpMethod = "GET"
            request.addValue(authorization, forHTTPHeaderField: "Authorization") //token elemanlarini ekledim
            URLSession.shared.dataTask(with: request, completionHandler: { (data:Data?, response:URLResponse?, error:Error?) in
                if error == nil {
                    if let httpResponse = response as? HTTPURLResponse {
                        if httpResponse.statusCode == 200 {
                            if let receivedData = data {
                                do {
                                    let jsonObject = try JSONSerialization.jsonObject(with: receivedData, options: .allowFragments)

                                    print(jsonObject)//json basarili

                                    if let array = jsonObject as? [[String:Any]] {
                                        var returningData:[IPBasedLocationData] = []
                                        for part in array {

                                        var dataPart = IPBasedLocationData()

                                        if let salesName = part["CAD"] {
                                            if let salesNameInString = salesName as? String {
                                                dataPart.name = salesNameInString
                                            }
                                        }
                                        if let salesId = part["REFID"] {
                                            if let salesIdInt = salesId as? Int {
                                                dataPart.id = salesIdInt
                                            }
                                        }

                                        if let salesDate = part["ISLEMTARIHI"]{
                                            if let salesDateInString = salesDate as? String{
                                                dataPart.date = salesDateInString
                                            }
                                        }
                                        if let salesProduct = part["PAKET"]{
                                            if let salesProductInString = salesProduct as? String{
                                                dataPart.product = salesProductInString
                                            }
                                        }
                                        if let salesPrice = part["TUTAR"]{
                                            if let salesPriceInString = salesPrice as? String{
                                                dataPart.price = salesPriceInString
                                            }
                                        }
                                            returningData.append(dataPart)
                                        }

                                        completionHandler(returningData)
                                    } else {
                                        completionHandler(nil)
                                    }
                                } catch let jsonError {
                                    print("jsonError:\(jsonError.localizedDescription)")
                                    completionHandler(nil)
                                }
                            } else {
                                print("there is no recevied data")
                                completionHandler(nil)
                            }
                        } else {
                            print("invalid response:\(httpResponse.statusCode)")
                            completionHandler(nil)
                        }
                    } else {
                        completionHandler(nil)
                    }
                } else {
                    print("request error:\(String(describing: error?.localizedDescription))")
                    completionHandler(nil)
                }
            }).resume()
        } else {
            completionHandler(nil)
        }
    }
23, Haziran, 2017 yasin tarafından yorumlandı

ve şöyle çağırmalısın,

getIpBasedLocationData(authorization: strTokenType2+" "+strAccessToken) { (locationData:[IPBasedLocationData]?) in
            DispatchQueue.main.async {
                if let receivedLocationData = locationData {
                    for dataPart in receivedLocationData {
                        if let salesName = dataPart.name{
                            print("adi: \(salesName)")
                        }
                        if let salesDate = dataPart.date{
                            print("tarih: \(salesDate)")
                        }
                        if let salesProduct = dataPart.product{
                            print("paket: \(salesProduct)")
                        }
                        if let salesPrice = dataPart.price{
                            print("tutar: \(salesPrice)")
                        }
                        if let salesId = dataPart.id{
                            print("id: \(salesId)")
                        }
                    }

                } else {
                    print("no location data received")
                }
            }
        }
23, Haziran, 2017 csayin tarafından yorumlandı
  getIpBasedLocationData(authorization: strTokenType2+" "+strAccessToken) { (locationData:[IPBasedLocationData]?) in
              DispatchQueue.main.async {
                if let receivedLocationData = locationData {
                    for dataPart in receivedLocationData {
                        if let salesName = dataPart.name{
                            print("adi: \(salesName)")
                        }
                        if let salesDate = dataPart.date{
                            print("tarih: \(salesDate)")
                        }
                        if let salesProduct = dataPart.product{
                            print("paket: \(salesProduct)")
                        }
                        if let salesPrice = dataPart.price{
                            print("tutar: \(salesPrice)")
                        }
                        if let salesId = dataPart.id{
                            print("id: \(salesId)")
                        }
                    }
                } else {
                    print("no location data received")
                }
            }
       }        
    }

metotu başarılı bir şekilde çalışıyor, ancak struct'ı

print(IPBasedLocationData())

ettiğimde bu şekilde nil dönüyor;

IPBasedLocationData(id: nil, name: nil, date: nil, product: nil,
price: nil)

arama işlemleri için struct'ın içerisini bir değişkene atayıp kullanmam gerek;

let salesDataStack:[IPBasedLocationData] = [] 
23, Haziran, 2017 yasin tarafından yorumlandı

boş struct nesnesini print edersen tabiki içeriği nil döner.
Niye böyle birşey yapıyorsun anlamadım.

getIpBasedLocationData metodunun completionHandler'ı başarılı bir şekilde data ile döndüğünde,

if let receivedLocationData = locationData {
                    for dataPart in receivedLocationData {

döngüden elde ettiğimi dataPart'ı class içerisinde oluşturduğun mutable bir IPBasedLocationData array property'sinin içerisine ekleyecek ve artık ne yapacaksan bu property'i kullanarak yapacaksın.

class ViewController: UIViewController {
          var salesDataStack:[IPBasedLocationData] = [] 
.
.
.
.
if let receivedLocationData = locationData {
       for dataPart in receivedLocationData {
             self.salesDataStack.append(dataPart)
23, Haziran, 2017 csayin tarafından yorumlandı
23, Haziran, 2017 csayin tarafından yeniden gösterildi

haklısınız anlaşılır şekilde ifade etmemişim; burdan sonra gelen verilerin adı alanını table view'da listeleyip seçilen verinin detay ekranına gidiyor, ve şimdiki amacım table view'da arama yapabilmek. salesDataStack.name alanını kullanabilmeyi hedeflemiştim.

23, Haziran, 2017 csayin tarafından yorumlandı

daha önce sizden cevabını aldığım search bar ve detay örneğinde ki fonksiyonda member hatası alıyorum. asıl sormak istediğim buydu aslında.

!:Value of type '[IPBasedLocationData]' has no member 'name'

func updateSearchResults(for searchController: UISearchController) {
    if let searchString:String = self.searchController.searchBar.text {
        if searchString != "" {
            self.filteredDataStack.removeAll(keepingCapacity: false)

            for dummyData in self.salesDataStack {
                let searchingFocus:String = salesDataStack.name //Value of type '[IPBasedLocationData]' has no member 'name'
                if (searchingFocus.range(of: searchString, options: String.CompareOptions.caseInsensitive, range: nil, locale: nil) != nil) {
                    self.filteredDataStack.append(dummyData)
                }
            }
        } else {
            self.filteredDataStack = self.salesDataStack
        }

        self.tableView.reloadData()
    }
}
23, Haziran, 2017 csayin tarafından yorumlandı

fonsiyondaki hatayı fark ettim ve şu şekilde düzenledim ;

func updateSearchResults(for searchController: UISearchController) {
    if let searchString:String = self.searchController.searchBar.text {

        if searchString != "" {
            self.filteredDataStack.removeAll(keepingCapacity: false)

            for salesData in self.salesDataStack {
                let searchingFocus:String = salesData.name
                if (searchingFocus.range(of: searchString, options: String.CompareOptions.caseInsensitive, range: nil, locale: nil) != nil) {
                    self.filteredDataStack.append(salesData)
                }
            }
        } else {
            self.filteredDataStack = self.salesDataStack
        }

        self.tableView.reloadData()
    }
}

uygulama çalışıyor ama hala arama yapınca table view boşa düsüyor filteredDataStack boş geliyor.

23, Haziran, 2017 csayin tarafından yorumlandı

fonksiyondaki hatayı fark ettim ve düzenledim şuan gayet satabil çalışıyor, yardımlarınız cevaplarınız ve sabrınız için çok teşekkür ederim Yasin hocam.

not: başlıktan gelen arkadaslar icin kafa karisikligi olmasin diye calisan kod blogunu soruyo yorum olarak yazdim.

24, Haziran, 2017 yasin tarafından yorumlandı

Rica ederim. Kolay gelsin

...