2016-12-16 3 views
0

Я не могу на всю жизнь понять, почему я получаю ошибку, что этот класс не соответствует протоколам NSCoding. Возможно, другой набор глаз поможет. Я попытался добавить комментарии, чтобы дать понять, что делает каждый func.Соответствует NSCoding

import Foundation 
import UIKit 

class Search: NSObject, NSCoding { 

// Global Variables 
var articlePicture: UIImage! 
var articleTitle: String 

// MARK: Public Init 
init(articlePicture: UIImage, articleTitle: String) { 
    self.articlePicture = articlePicture 
    self.articleTitle = articleTitle 
} 

// Required NSCoding Protocol 
required convenience init?(coder decoder: NSCoder) { 
    guard let articlePicture = decoder.decodeObject(forKey: "articlePicture") as? UIImage, 
     let articleTitle = decoder.decodeObject(forKey: "articleTitle") as? String 
     else { return nil } 

    self.init(
     articlePicture: articlePicture, 
     articleTitle: articleTitle 
    ) 
} 

// Required NSCoding Protocal 
func encodeWithCoder(coder: NSCoder) { 
    coder.encode(self.articlePicture, forKey: "articlePicture") 
    coder.encode(self.articleTitle, forKey: "articleTitle") 
} 

// Initialize [Search] 
static var searches = [Search]() 

static func getSearches() -> [Search]{ 
    return searches 
} 

static func setSearch(search: Search){ 
    searches.append(search) 
} 

// NSUserDefaults Searches Array funcs 
static func saveSearches(){ 
    let searchData = NSKeyedArchiver.archivedData(withRootObject: searches) 
    UserDefaults.standard.set(searchData, forKey: "searches") 
} 

static func loadSearches() -> [Search]{ 
    let searchData = UserDefaults.standard.object(forKey: "searches") as? NSData 

    if let searchData = searchData { 
     searches = (NSKeyedUnarchiver.unarchiveObject(with: searchData as Data) as? [Search])! 
     return searches 
    } 
    return searches 
} 
} 

ответ

1

Советы: нажмите Cmd + 4, чтобы открыть выпуск Navigator и Xcode сообщит вам более подробную информацию.

В Swift 3, функция кодирования была изменена: подпись

func encodeWithCoder(coder: NSCoder) { 
    // Swift 2 and older 
} 

func encode(with coder: NSCoder) { 
    // Swift 3 
} 

Изменение метода и вы должны быть хорошо

0

В Swift 4 есть еще один способ кодирования/декодирования классов. Теперь вам нужно будет только соответствовать протоколу Codable. Больше не нужно писать все ваши кодировки и декодирования и поддерживает классы без NSObject & перечисления & structs.

final class Search: Codable { 

} 

Для получения более подробной информации читайте https://developer.apple.com/documentation/swift/codable

+0

Это не верно. NSCoding полностью не уходит. Вы все еще нуждаетесь в этом. Вы вообще не ответили на вопрос. – matt

+0

Вам больше не нужно NSCoding для декодирования/кодирования в Swift 4. Если вы прочтете больше информации, вы поймете. На самом деле это не ответ на вопрос, я предоставил другой способ декодирования/кодирования, который является более современным. –

+0

Ваше первое предложение неверно. NSCoding не изменился полностью. Это совсем не изменилось. И вы все равно встретитесь с необходимостью реализовать 'encode (with)', и вы не объясняете, что делать. Наконец, ваш ответ не имеет отношения к тому, что было задано. И это только ссылка. Это неправильный бесполезный ответ. – matt

Смежные вопросы