Невозможно присвоить значение типа «некоторое представление» типу «некоторое представление» - PullRequest
0 голосов
/ 21 апреля 2020

Я только начал изучать SwiftUI и пытался вызвать метод, который возвращает View, переменной типа View, но получил эту удивительную ошибку:

Cannot assign value of type 'some View' 
(result of 'Self.frame(width:height:alignment:)') 
to type 'some View' 
(result of 'Self.fill(_:style:)')

Я хотел попробовать создать представление, просто чтобы посмотреть, что произойдет, понять, как SwiftUI приходит к измерениям для вещей.

    let p = Path({ (path:inout Path) -> () in
        path.addRect(CGRect(
            x:0,
            y:0,
            width:geometry.size.width,
            height:geometry.size.height
        ))
    })
    var result = p.fill(Color.red)
    result = result.frame(width: 100, height: 100)

Я думаю, что здесь происходит то, что сначала я создаю struct Path, и вызываю его метод fill, это в представлении. Когда я устанавливаю var result на это возвращаемое значение, следует сделать вывод, что он имеет тип View, что, как говорит XCode, делает.

enter image description here

Так как протокол View имеет метод frame(width:height:alignment:) -> some View, я вызываю его, чтобы получить новый View. Теперь, поскольку result подразумевается как View, и я присваиваю ему результат frame, также View, разве это не должно быть законным?

(On другой StackOverflow вопрос кто-то прокомментировал «некоторый View - означает, что один конкретный тип, который соответствует View, не может быть однажды MenuView, а другой раз - CreateChannelView.» . Может ли это быть так? Если да, то я » Я также хотел бы знать, как увидеть, какой конкретный тип возвращает метод.)

enter image description here

1 Ответ

1 голос
/ 21 апреля 2020

Вместо

var result = p.fill(Color.red)
result = result.frame(width: 100, height: 100)

используйте прямой комбинированный вид как

return p.fill(Color.red).frame(width: 100, height: 100)

some View означает некоторый тип непрозрачного бетонного вида но для использования присваивания тип должен быть одинаковым, однако модификаторы .fill и .frame дают разные конкретные типы, поэтому ваше присваивание сгенерировало ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...