0
votes

Xcode is yelling error

enter image description here

But I don't know what happen. I've been searching and I think it might be something about casting and optional. The first one gives Initializer for conditional binding must have Optional type, not 'Date' and the second and third gives Initializer for conditional binding must have Optional type, not 'Double'

for article in (topic.articleArrays ?? nil)!{
            if let articleId = article.id,
            let articleHeadline = article.headline,
            let articleSummary = article.summary,
            let articleCity = article.city,
            let articleState = article.state,
            let articleDateretrieved = article.dateRetrieved,
            let articlePublisher = article.publisher,
            let articleLatitude = article.latitude,
            let articleLongitude = article.longitude,
            let articleRawBaseUrl = article.rawBaseUrl,
            let articleRawUrl = article.rawUrl {
                editedArticles?.append(NewsArticle(id: articleId, headline: articleHeadline, publisher: articlePublisher, summary: articleSummary, rawUrl: articleRawUrl, rawBaseUrl: articleRawBaseUrl, retrieved_date: articleDateretrieved, city: articleCity, state: articleState, latitude: articleLatitude, longitude: articleLongitude))
            }
        }

The struct for ediedArticles is NewsArticle which I've listed below

struct NewsArticle {
var id: String
var headline: String
var publisher: String
var summary: String
var rawUrl: String
var rawBaseUrl: String
var retrieved_date: Date
var city: String
var state: String
var latitude: Double
var longitude: Double
init(id: String, headline: String, publisher: String, summary: String, rawUrl: String, rawBaseUrl: String, retrieved_date: Date, city: String, state: String, latitude: Double, longitude: Double) {
    self.id = id
    self.headline = headline
    self.publisher = publisher
    self.summary = summary
    self.rawUrl = rawUrl
    self.rawBaseUrl = rawBaseUrl
    self.retrieved_date = retrieved_date
    self.city = city
    self.state = state
    self.latitude = latitude
    self.longitude = longitude
    }
}

topic.articlesArray have different data structure type which is SavedArticle (CoreData)

var articleArrays: [SavedArticle]? {
    return self.articles?.allObjects as? [SavedArticle]
}

and have SavedArticle-CoreDataClass

var dateRetrieved: Date {
    get {
        return retrieved_date as Date
    }
    set(newDate) {
        retrieved_date = newDate as NSDate
    }
}

// TODO: Figured it out how to stored corrdinates in [Double]

convenience init?(id: String, headline: String, publisher: String, summary: String, retrieved_date: Date, city: String, state: String, latitude: Double, longitude: Double) {

    guard let context = NaberCoreDataHandler.sharedInstance.managedContext else { return nil }
    self.init(entity: SavedArticle.entity(), insertInto: context)

    self.id = id
    self.headline = headline
    self.publisher = publisher
    self.summary = summary
    self.dateRetrieved = retrieved_date
    self.city = city
    self.state = state
    self.latitude = latitude
    self.longitude = longitude
}

with a SavedArticle-CoreDataProperties of following

@NSManaged public var city: String?
@NSManaged public var headline: String?
@NSManaged public var id: String?
@NSManaged public var publisher: String?
@NSManaged public var rawBaseUrl: String?
@NSManaged public var rawUrl: String?
@NSManaged public var retrieved_date: NSDate
@NSManaged public var state: String?
@NSManaged public var summary: String?
@NSManaged public var latitude: Double
@NSManaged public var longitude: Double
@NSManaged public var topics: SavedTopic?

It would be awesome if someone can help me figured it out what's the problem. I've beent rying for the whole day and nothing helps. Thank you! :)

2

2 Answers

7
votes

if let (and guard let) can only be used to unwrap optional values. You can either assign those values with regular let statements on a separate line, or just pass them into the function directly since they don't need to be unwrapped.

1
votes

article.dateRetrieved, article.latitude, and article.longitude are not Optionals. They are not declared with ? after their type names, so they can never be nil. There is therefore no need -- and in fact it is an error -- to try to unwrap them with an "if let" statement.

Remove the three lines of code that the compiler is complaining about.

When you create the NewsArticle and append it to editedArticles, you can pass those properties of article directly to the constructor of NewsArticle.