FYI: Swift bug podniesione tutaj: https://bugs.swift.org/browse/SR-3871Nie można rzucić w Swift z Dowolnego? protokołu
Mam dziwny problem, gdzie obsada nie pracuje, ale konsola pokazuje go jako odpowiedniego typu.
Mam Public protocol
public protocol MyProtocol { }
I zaimplementować to w module, z publiczną metodę, która zwraca instancję.
internal struct MyStruct: MyProtocol { }
public func make() -> MyProtocol { return MyStruct() }
Wtedy, moim zdaniem regulatora, ja wywołać segue z tego obiektu jako nadawca
let myStruct = make()
self.performSegue(withIdentifier: "Bob", sender: myStruct)
Wszystkie dobre do tej pory.
Problem jest w mojej metodzie prepare(for:sender:)
.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "Bob" {
if let instance = sender as? MyProtocol {
print("Yay")
}
}
}
Jednak odlewanie instancji do MyProtocol zawsze zwraca nil
.
Po uruchomieniu po sender as! MyProtocol
w konsoli, pojawia się błąd Could not cast value of type '_SwiftValue' (0x1107c4c70) to 'MyProtocol' (0x1107c51c8)
. Jednak po sender
wyświetli prawidłową instancję Module.MyStruct
.
Dlaczego ten rzut nie działa?
(udało mi się go rozwiązać przez boks mój protokół w struct, ale chciałbym wiedzieć, dlaczego to nie działa jak jest, a jeśli nie ma lepszego sposobu, aby go naprawić)
tutaj tylko kończy się tutaj, ale czy zmiana wewnętrznej deklaracji tutaj "wewnętrzna struktura MyStruct: MyProtocol {}' na "publiczne" coś zmienić? – Dennis
@Dennis Nope :( – deanWombourne