Кажется, что нет никаких проблем в самом объявлении метода
func set<T: Any>(_ value: T?, forKey key: String) where T: NSCoding {
if let value = value {
let encodedValue = NSKeyedArchiver.archivedData(withRootObject: value)
UserDefaults.standard.set(encodedValue, forKey: key)
} else {
UserDefaults.standard.removeObject(forKey: key)
}
}
Но ошибка компиляции указывает на то, что значение, передаваемое этой функции, может быть несовместимо с примером NSCoding
вызов вышеуказанной функции с помощью
self.set("abcd", forKey: "test")
выдает ошибку
Невозможно преобразовать значение типа 'String' в ожидаемый тип аргумента '_?'
С другой стороны, называя его
self.set(NSString(string: "abcd"), forKey: "test")
Работает нормально.Поэтому убедитесь, что вы передали верный аргумент :)
РЕДАКТИРОВАТЬ 1:
На основании комментария ОП проверен метод Generics с Int
let test: Int = 100
self.set(test, forKey: "test")
Приводит к той же ошибке, помещая ее в NSNumber, хотя
let test: Int = 100
self.set(NSNumber(value: test), forKey: "test")
РЕДАКТИРОВАТЬ 2:
Ответ на комментарий OP
Но почему Stringзначения проходят, если (значение NSCoding) проверяется в моей исходной функции?
let a: Any = "abcd"
if a is NSCoding {
debugPrint("am here")
}
Это потому, что ваш any проходит проверку NSCoding
, и в вашем случае, независимо от того, какое значение вы передаете набираемой функцииприведите его к Any
и Any
пройдет через проверку :)
Следовательно, он работает в вашем первом методе, но не работает с обобщениями :) Надеюсь, это поможет