Как преобразовать 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

}