Quando trabalhamos com dados, muitas vezes é necessário converter variáveis de um tipo de dados para outro. Por exemplo, exibir o resultado de um cálculo requer a conversão de um float em uma string.
Todas as conversões de tipos em Verse são explícitas, o que significa que você deve usar uma função como ToString() ou usar um operador, como o de multiplicação (*), para converter um objeto em um tipo de dado diferente. A conversão explícita de um tipo para outro também é chamada de conversão de tipo.
Como converter de float para int
A conversão de um float em um int requer uma função que especifique explicitamente como converterá um número de ponto flutuante em um número inteiro. As funções a seguir lidam com a conversão, mas todas funcionam de maneira diferente. Cabe a você decidir qual delas funciona melhor em uma determinada situação.
Neste exemplo, diferentes funções convertem quatro valores literais float em valores int usando o operador or para criar um contexto de falha. Em seguida, set atribui os valores a variáveis do tipo int.
# The Int[] method has the <decides> effect,
# This means that we need to account for failure as it is a failable expression.
# This results in the following
# var WoodInt:int = failable expression or the value if it fails.
var WoodCollectedFloat:float = 10.5
var WoodInt:int = Int[WoodCollectedFloat] or 0
Print("Printing WoodInt Value (10): {WoodInt}")
# Similar to Int[], Floor[], Ceil[], and Round[] also have the <decides> effect
Neste exemplo, a expressão if cria o contexto de falha para essas funções falíveis e set atribui os valores a variáveis do tipo int.
var WoodCollected:int = 0
var StoneCollected:int = 0
var GoldCollected:int = 0
var FoodCollected:int = 0
if:
# This block is the condition of the if expression
# Which creates the failure context
# If any fail, the entire chain of execution is rolled back
# And the else branch, if it exists, is executed
Como converter de int para float
O operador de multiplicação (*) converte o número inteiro em um número de ponto flutuante antes de realizar a multiplicação. A maneira de converter de um int para um tipo de dados float é multiplicar o número inteiro por 1.0.
Esse código converte a variável int StartingPositionX em um float por meio da multiplicação, para que possa ser usada na declaração de uma variável vector3. O tipo de dados vector3 requer valores do tipo float para seus campos X, Y e Z.
# Required for the vector3 type
using { /UnrealEngine.com/Temporary/SpatialMath}
var StartingPositionX:int = 960
# CurrentX = 960.0
var CurrentX:float = StartingPositionX * 1.0
var CurrentPosition:vector3 = vector3{X := CurrentX, Y := 0.0, Z := 0.0}
Print("CurrentX: {CurrentX}")Como converter para uma string
Você pode converter vários tipos de dados em uma string usando uma função ToString() ou a interpolação de strings, que chama uma função ToString(). No momento, os seguintes tipos têm funções ToString() integradas em Verse.
float
int
[]char
char
vector2
vector3
rotation
Neste exemplo, é possível ver as variáveis sendo convertidas em uma string por meio da interpolação de strings e de funções ToString(). Ambos os métodos têm o mesmo resultado porque a interpolação de strings chama ToString().
var WoodCollected:int = 100
# Convert using string interpolation
Print("WoodCollected: { WoodCollected }")
# or ToString() function
Print("WoodCollected: " + ToString(WoodCollected))
var InitialDistance:float = 3.625
# Convert using string interpolation
Print("InitialDistance: { InitialDistance }")
# or ToString() function
Como converter um tipo de dado personalizado em uma string
Tipos de dados personalizados também podem ser convertidos em strings, implementando uma função ToString(custom_type) para o tipo de dados. Se existir uma função ToString(custom_type), a interpolação de strings irá usá-la para converter automaticamente os tipos de dados em strings.
Aqui está um exemplo de uma função ToString() personalizada para um enum de frutas.
fruit := enum:
Apple
Banana
Strawberry
ToString(Fruit: fruit):string =
case(Fruit):
fruit.Apple => "Apple"
fruit.Banana => "Banana"
fruit.Strawberry => "Strawberry"
Aqui está um exemplo de uma função ToString() personalizada para uma classe personalizada. Observe que a função ToString() é declarada fora da classe waypoint. Na função SetDestination(), a interpolação de strings de Destination está chamando a função personalizada ToString().
# Custom class with constructor and a ToString() function
waypoint := class():
DisplayName:string
Position:vector3 = vector3{}
MakeWaypoint<constructor>(Name:string, X:float, Y:float, Z:float) := waypoint:
DisplayName := Name
Position := vector3{X := X, Y := Y, Z := Z}
ToString(Waypoint: waypoint):string =
Como converter uma referência de objeto em um tipo diferente
Você pode converter explicitamente referências a objetos (ou conversão de tipo) em diferentes classes ou interfaces usando a seguinte sintaxe:
if (NewObjectReference := object_type_to_cast_to[ObjectReference]) {}O object_type_to_cast_to representa a classe ou interface para a qual você está tentando converter a referência. Esta é uma expressão falível porque a conversão de tipos falhará se o objeto não puder ser convertido para o tipo especificado. A tentativa de converter uma referência de objeto em uma classe falhará se a classe não corresponder ao tipo do objeto, ao tipo de uma superclasse ou a uma interface implementada pela classe do objeto.
Esse código declara uma interface positionable, uma classe abstrata shape que herda de positionable e duas subclasses de shape: triangle e square. Em seguida, cria um objeto do tipo square chamado MyShape e tenta convertê-lo em três outros tipos. Aqui está uma análise dos resultados.
| square Conversão de Tipo em | Resultado |
|---|---|
| funciona porque |
| falha porque |
| funciona porque |
# Class and interface definitions
positionable := interface() {}
shape := class<abstract>(positionable) {}
triangle := class(shape) {}
square := class(shape) {}
# Create a square object referenced using the superclass type shape
MyShape:shape = square{}
# This will succeed since MySquare is a square object
No último exemplo, a conversão de tipos funcionará, mas não é necessária. Este código terá o mesmo resultado:
MyDrawable:positionable = MyShapeExemplos usando a conversão de tipo
Um caso de uso para conversão de tipos de objeto no UEFN é encontrar atores de um determinado tipo e chamar funções com base no tipo. Para saber como fazer isso, consulte Como encontrar atores com uma tag de jogabilidade nas tags de jogabilidade.