Swift 等效于此 ActionScript 函数
Swift equivalent of this ActionScript function
我把这个tutorial on 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(尽我所能)我一定是写错了,因为该函数在不应该返回 nil 值的时候返回。
我在 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帮我打理房间
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)
}
}
我在不应该的时候得到了一个零值。我想我把函数翻译错了。 Rectangle
在 Swift 中会是 CGRect
但我在代码的其他地方用我的 Room
class 替换了它,所以我知道它会与Room
class 这里。
Swift这个函数怎么写?
你的问题是你正在强制解包 getRoom
的结果 - 这个函数 return 是一个可选的并且可以合法地 return 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
}
}
我把这个tutorial on 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(尽我所能)我一定是写错了,因为该函数在不应该返回 nil 值的时候返回。
我在 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帮我打理房间
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)
}
}
我在不应该的时候得到了一个零值。我想我把函数翻译错了。 Rectangle
在 Swift 中会是 CGRect
但我在代码的其他地方用我的 Room
class 替换了它,所以我知道它会与Room
class 这里。
Swift这个函数怎么写?
你的问题是你正在强制解包 getRoom
的结果 - 这个函数 return 是一个可选的并且可以合法地 return 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
}
}