def _get_types(type_string):
    """
    Parses a string a a list of types on the string

    :param str type_string: the string from a class dump to be parsed
    :return: a list with types
    """
    known_types = {
        "v": "void",
        "f": "float",
        "s": "short", "S": "short",
        "I": "unsigned int",
        "C": "unsigned char",
        "i": "long long", "q": "long long",
        "d": "double",
        "B": "Bool", "c": "Bool", "Q": "Bool",
        "l": "long", "L": "long",
        "*": "char * ",
        "@": "id",
        "#": "Class",
        ":": "SEL",
        "%": "UnkownType"
    }

    # replace unkown types
    type_string = type_string.replace(
        "@0:", "").replace("@?", "%").replace("^?", "%")

    # prepare variables
    types = []
    new_type = None
    new_type_found = 0 # there can be nested new types - just parsing the first

    # parse string
    for char in type_string:

        # found new type
        if char == "{":
            new_type_found += 1
            if new_type_found == 1:
                new_type = ""

        # save new type
        elif char == "=" and new_type_found:
            types += ["struct {}".format(new_type)]
            new_type = None

        # parsing new type name
        elif new_type_found > 0 and new_type != None:
            new_type += char

        # stop parsing new type
        elif char == "}":
            new_type_found -= 1

        # check if known type
        elif char in known_types and new_type_found == 0:
            types += [known_types[char]]

    return types