Tic-Tac-Toe - X or O? Background
Skip to &quot;Task&quot; if you are familiar with Tic-Tac-Toe (I think most are!)
Tic-Tac-Toe is a famous two-player game. It consists of a 3x3 board that is filled gradually by two players (clarifications below); The first player uses the character X and the other one uses O. The winner is the first to get 3 consecutive and identical characters (X or O), either horizontally, vertically or diagonally. In case the board is filled and none of the players managed to get three consecutive characters as decribed above, the game ends in a tie. Note that there might be empty spots at the end of the game, in case either of the players wins in less than 9 moves in total (this cannot happen in case of a tie).
Task
Given a Tic-Tac-Toe board at the end of a game (in the form of a string, a matrix, a flat list of 9 ordered values, any other decent format), determine who wins the game.

The input will consist of distinct and consistent values, one for X, one for O and another one that represents an empty spot.

Your program should be able to output 3 distinct, consistent and non-empty values: one in case X wins, another one in case O wins or another if the players are tied.
Please specify these values in your answer. You can assume that the input will be a valid Tic-Tac-Toe board.


Test Cases
X, O, _ are the input values here; X wins, O wins and Tie are for the output.
X O X
O X _
O _ X

Output: X wins.
X _ O
X O _
X O X

Output: X wins.
X O X
_ O X
_ O _

Output: O wins.
X O X
O O X
X X O

Output: Tie.

As usual, all our standard rules apply. This is code-golf, the shortest code in bytes in every language wins!
Jelly,  16 15  14 bytes
U,Z;ŒD$€ẎḄỊÐḟḢ

A monadic link accepting a list of lists (the rows - or columns) with the values:
X = 0.155; O = -0.155; _ = 0

Returning results:
X wins = 1.085; O wins = -1.085; Tie = 0

Note: using a value of zero for _, and equal but opposite values for X and O, this value (here 0.155) may be in the range (1/6, 1/7) (exclusive at both ends) - I only chose a value in that range that gave a precisely representable floating point result for the win cases.
Try it online!
How?
U,Z;ŒD$€ẎḄỊÐḟḢ - Link: list of lists (as described above)
U              - upend (reverse each row)
  Z            - transpose (get the columns)
 ,             - pair the two
      $€       - last two links as a monad for each of them:
    ŒD         -   diagonals (leading diagonals - notes: 1. only one is of length 3;
               -              2. the upend means we get the anti-diagonals too)
   ;           -   concatenate (with the rows/columns)
        Ẏ      - tighten (make a single list of all the rows, columns and diagonals)
         Ḅ     - from binary (vectorises) (note that [0.155, 0.155, 0.155]
               -                           converts to 4*0.155+2*0.155+1*0.155 = 1.085
               -                           and [-0.155, -0.155, -0.155]
               -                           converts to 4*-0.155+2*-0.155+1*-0.155 = -1.085
               -                           while shorter lists or those of length three
               -                           with any other mixtures of 0.155, -0.155 and 0
               -                           yield results between -1 and 1
               -                           e.g. [.155,.155,0] -&gt; 0.93)
           Ðḟ  - filter discard if:
          Ị    -   insignificant (if abs(z) &lt;= 1) (discards all non-winning results)
             Ḣ - head (yields the first value from the list or zero if it's empty)