Как преобразовать Tuple в AnyObject в Swift
Следующая часть кода компилируется с ошибкой: Error:(112, 20) type '(String, Int)' does not conform to protocol 'AnyObject'
func myMethode() {
aMethodeThatICanNotChange {
let a = ("John",7)
return a // Error:(112, 20) type '(String, Int)' does not conform to protocol 'AnyObject'
}
}
func aMethodeThatICanNotChange(closure: () -> AnyObject) {
// do something with closure
}
Как я могу сделать бросок/преобразование кортежа в AnyObject?
Ответы
Ответ 1
Как я могу сделать бросок/преобразование кортежа в AnyObject?
Проще говоря, вы не можете. Только типы классов (или типы, которые соединяются с типами классов Foundation) могут быть переданы в AnyObject. Кортеж не является типом класса.
Конечно, может быть много других способов добиться того, чего вы действительно пытаетесь достичь. Но что касается вашего конкретного вопроса, вы не можете этого сделать.
Ответ 2
Это всего лишь обходной путь.
Вы можете создать класс для обертывания вашего кортежа.
class TupleWrapper {
let tuple : (String, Int)
init(tuple : (String, Int)) {
self.tuple = tuple
}
}
Затем вы можете написать это:
func myMethod() {
aMethodeThatICanNotChange {
let a = ("John",7)
let myTupleWrapper = TupleWrapper(tuple: a)
return myTupleWrapper
}
}
В качестве альтернативы вы можете создать общую оболочку, которая может получить значение любого Type
.
class GenericWrapper<T> {
let element : T
init(element : T) {
self.element = element
}
}
Надеюсь, что это поможет.
Ответ 3
Кортеж представляет собой упорядоченный список элементов, поэтому вы можете преобразовать его в Array
, который соответствует протоколу AnyObject
func myMethode() {
aMethodeThatICanNotChange {
// let a = ("John",7)
let b = ["Joth", 7]
return b // No error
}
}
func aMethodeThatICanNotChange(closure: () -> AnyObject) {
// do something with closure
}