Быстрый эквивалент этой функции ActionScript - PullRequest
0 голосов
/ 05 октября 2018

Я перевел это руководство по BSP на swift.В этом уроке есть эта функция ActionScript.

public function getRoom():Rectangle
{
    // iterate all the way through these leafs to find a room, if one exists.
    if (room != null)
        return room;
    else
    {
        var lRoom:Rectangle;
        var rRoom:Rectangle;
        if (leftChild != null)
        {
            lRoom = leftChild.getRoom();
        }
        if (rightChild != null)
        {
            rRoom = rightChild.getRoom();
        }
        if (lRoom == null && rRoom == null)
            return null;
        else if (rRoom == null)
            return lRoom;
        else if (lRoom == null)
            return rRoom;
        else if (FlxG.random() > .5)
            return lRoom;
        else
            return rRoom;
    }
}

Я перевел эту функцию на Swift (в меру своих возможностей). Я, должно быть, написал ее неправильно, потому что функция возвращает нулевое значение, когда она не должнаbe.

Моя версия в Swift:

// left/right child are initialized as follows:
// leftChild:Room?
// rightChild:Room?

public func getRoom() -> Room? {
    if room != nil {
        return room
    } else {
        var lRoom:Room?
        var rRoom:Room?

        if leftChild != nil {
            lRoom = leftChild!.getRoom()!
        }
        if rightChild != nil {
            rRoom = rightChild!.getRoom()!
        }
        if lRoom == nil && rRoom == nil {
            return nil
        } else if rRoom == nil {
            return lRoom
        } else if lRoom == nil {
            return rRoom
        } else if  Double.random(in: 0..<1.0) > 0.5 {
            return lRoom
        } else {
            return rRoom

        }
    }
}

Где Room - базовый класс, который я сделал, чтобы помочь мне справиться с комнатами.

class Room {
    var x1:Int
    var x2:Int
    var y1:Int
    var y2:Int
    var center:CGPoint

    init(X: Int, Y: Int, W: Int, H: Int) {
        x1 = X
        x2 = X + W
        y1 = Y
        y2 = Y + H
        center = CGPoint(x: (x1 + x2) / 2, y: (y1 + y2) / 2)
    }
}

I 'я получаю нулевое значение, когда я не должен быть.Я думаю, что я перевел функцию неправильно.Rectangle было бы CGRect в Swift, но я заменил его своим классом Room в других местах кода, поэтому я знаю, что он будет работать с классом Room здесь.

Как эта функция будет написана на Swift?

1 Ответ

0 голосов
/ 05 октября 2018

Ваша проблема в том, что вы принудительно распаковываете результат getRoom - Эта функция возвращает необязательный параметр и может законно вернуть nil, когда ваш обход достигает конечного узла.Принудительное развертывание nil приводит к падению

Правильное использование условного развертывания позволяет не только сделать ваш код более читабельным, но и устранить ошибку.

public func getRoom() -> Room? {

    if let _ = room {
        return room
    }

    let lRoom = leftChild?.getRoom()
    let rRoom = rightChild?.getRoom()

    switch (lRoom != nil, rRoom != nil) {
    case (false,false):
        return nil
    case (true,false):
        return lRoom
    case (false,true):
        return rRoom
    case (true,true):
        return arc4random_uniform(2) == 1 ? lRoom: rRoom
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...