【问题标题】:Cannot convert value of type 'String?' to expected argument type 'Class?'无法转换“字符串”类型的值?到预期的参数类型“类?”
【发布时间】:2021-09-18 07:39:58
【问题描述】:

我正在尝试使用库 Alamofire 获取数据,架构是 MVVM。有一个类(Web 服务类)调用 Alamofire 请求,但是当我解码时它显示一个错误“无法转换类型为‘字符串’的值?到预期的参数类型'Gregorian?'”。如何解决此问题。

祈祷.swift

class Prayer: Codable {
    let code: Int?
    let status: String?
    let data: DataClass?

    init(code: Int?, status: String?, data: DataClass?) {
        self.code = code
        self.status = status
        self.data = data
    }
}

// MARK: - DataClass
class DataClass: Codable {
    let timings: Timings?
    let date: DateClass?
    let meta: Meta?

    init(timings: Timings?, date: DateClass?, meta: Meta?) {
        self.timings = timings
        self.date = date
        self.meta = meta
    }
}

// MARK: - DateClass
class DateClass: Codable {
    let readable, timestamp: String?
    let hijri: Hijri?
    let gregorian: Gregorian?

    init(readable: String?, timestamp: String?, hijri: Hijri?, gregorian: Gregorian?) {
        self.readable = readable
        self.timestamp = timestamp
        self.hijri = hijri
        self.gregorian = gregorian
    }
}

// MARK: - Gregorian
class Gregorian: Codable {
    let date, format, day: String?
    let weekday: GregorianWeekday?
    let month: GregorianMonth?
    let year: String?
    let designation: Designation?

    init(date: String?, format: String?, day: String?, weekday: GregorianWeekday?, month: GregorianMonth?, year: String?, designation: Designation?) {
        self.date = date
        self.format = format
        self.day = day
        self.weekday = weekday
        self.month = month
        self.year = year
        self.designation = designation
    }
}

WebService.swift

class WebService : NSObject{
    static let shareInstance = WebService()
    func getPrayerTimingsDataCurrentLocation(completion: @escaping(Timings?,Gregorian?, Error?) -> ()){
        let url = "http://api.aladhan.com/v1/timings/20%20June%202021?latitude=51.508515&longitude=-0.1254872&method=2"
        
        AF.request(url, method: .get, parameters: nil, encoding: URLEncoding.default, headers: nil, interceptor: nil).response {
            (responseData) in
            guard let data = responseData.data else {return}
            do {
                let prayerDate = try JSONDecoder().decode(Prayer.self, from: data).data?.date?.gregorian?.date
                let prayerTimings = try JSONDecoder().decode(Prayer.self, from: data).data?.timings
                completion(prayerTimings,prayerDate, nil) //Here getting error on 'prayerDate' Cannot convert value of type 'String?' to expected argument type 'Gregorian?'

            } catch {
                print(String(describing: error))
            }
        }
    }
}

【问题讨论】:

标签: ios swift alamofire


【解决方案1】:

你有以下行:

let prayerDate = try JSONDecoder().decode(Prayer.self, from: data).data?.date?.gregorian?.date

这会得到一个String?,因为您正在访问Gregoriandate 属性,该属性被定义为String?

既然您只想要Gregorian?,请删除.date

let prayerDate = try JSONDecoder().decode(Prayer.self, from: data).data?.date?.gregorian

【讨论】:

    猜你喜欢
    • 2019-12-24
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-12
    • 1970-01-01
    相关资源
    最近更新 更多