2016-03-16 4 views
0

Я пытаюсь вернуть значение из действия, но я получаю две ошибки:возвращаемый результат действий по Function

Using the generic type 'List<T>' requires 1 type arguments

и

'DataManager.MissionData' is a type, which is not valid in the given context

GameSmart.sdk.LoadData() загружает данные с нашего веб-сервера с помощью класс WWW. Я хотел бы вернуть ответ в Action и сохранить его в переменной data и вернуть LoadDataFromGameSmart эти данные.

public Type LoadDataFromGameSmart<Type>(){ 
    Type data = default(Type); 
    Debug.Log ("Loading Data from GameSmart"); 
    GameSmart.sdk.LoadData(List<MissionData> data = (LoadDataResponse response) => { 
     return JsonUtility.FromJson<GSWrapper>(response.data).missionData; 
    }); 
    return data; 
} 

[System.SerializableAttribute] 
public class GSWrapper { 

    public List<MissionData> missionData; 

    public static GSWrapper CreateFromJSON(string jsonString){ 
     return JsonUtility.FromJson<GSWrapper>(jsonString); 
    } 
} 

LoadData выглядит следующим образом:

public void LoadData(Action<LoadDataResponse> onComplete = null){ 
    if(!IsValid()){return;} 
    Send(endpoint_loadData, onComplete); 
} 
protected void Send<T>(string endpoint, Action<T> onComplete = null){ 
    WWWForm form = new WWWForm(); 
    StartCoroutine(Request(endpoint, form, onComplete)); 
} 
IEnumerator Request<T>(string endpoint, WWWForm form, Action<T> onComplete = null){ 
    form.AddField("playToken", playToken); 
    WWW www = new WWW((protocol + "://" + GetHostName() + api_path) + endpoint, form); 
    yield return www; 
    if(onComplete != null){ 
     onComplete(JsonUtility.FromJson<T>(www.text)); 
    } 
} 

Я попытался с помощью:

GameSmart.sdk.LoadData(Func<Type> data = (LoadDataResponse response) => { 
    return JsonUtility.FromJson<GSWrapper>(response.data).missionData; 
}); 

Но тогда я получаю эту ошибку:

Using the generic type 'Func<TResult>' requires 1 type arguments

Не уверен, если это уместно, но вот MissionData класс:

[System.Serializable] 
public class MissionData 
{ 
    public int ID;//the ID of the Mission 
    public bool isLocked = true; 
    public List<LevelData> levelsData = new List<LevelData>();//the levels of the mission 

    /// <summary> 
    /// Find the level data by ID. 
    /// </summary> 
    /// <returns>The level data.</returns> 
    /// <param name="ID">the ID of the level.</param> 
    public LevelData FindLevelDataById (int ID) 
    { 
     foreach (LevelData levelData in levelsData) { 
      if (levelData.ID == ID) { 
       return levelData; 
      } 
     } 
     return null; 
    } 
} 

Итак, как я могу вернуть результат действий, так что LoadDataFromGameSmart может возвращать конечный результат?

+0

'GameSmart.sdk.LoadData (Список data = ...);' не похож на действительный синтаксис C#. Вы пытаетесь объявить новую переменную, называемую 'data', в этом месте? Если нет, зачем упоминать тип 'List '? –

+0

Удаление, которое дает эту ошибку: 'Невозможно преобразовать лямбда-выражение в тип 'Тип', потому что это не тип делегата' –

+0

Что такое подпись' LoadData'? Есть ли какая-либо документация о том, что она ожидает? –

ответ

2

Ваш синтаксис не является правильным:

public Type LoadDataFromGameSmart<Type>(){ 
    Type data = default(Type); 
    Debug.Log ("Loading Data from GameSmart"); 
    GameSmart.sdk.LoadData(List<MissionData> data = (LoadDataResponse response) => { 
     return JsonUtility.FromJson<GSWrapper>(response.data).missionData; 
    }); 
    return data; 
} 

Некоторые из вопросов:

  1. данных определяется дважды (один раз как Type, один раз как List<MissionData>)
  2. LoadData(List<MissionData> data является недействительным синтаксис.
  3. LoadData ожидает Action, но вы возвращаете данные
  4. Ваш шаблон Type не имеет никаких ограничений, и как таковые не могут быть преобразованы в List<MissionData>
  5. (LoadDataResponse response) должен быть (response) - не определить типы аргументов при переходе лямбда - они определяются LoadData's signature в этом случае

Вы можете попробовать что-то вроде этого:

public List<MissionData> LoadDataFromGameSmart() 
{ 
    List<MissionData> data = null; 
    Debug.Log ("Loading Data from GameSmart"); 
    GameSmart.sdk.LoadData(
    (response) => { 
     data = JsonUtility.FromJson<GSWrapper>(response.data).missionData; 
    }); 
    return data; 
} 

Предполагая, что LoadData является , блокирующий, это вернет данные должным образом.

+0

Я не верю, что LoadData блокирует. http://docs.unity3d.com/ScriptReference/MonoBehaviour.StartCoroutine.html –

+0

@GetOffMyLawn В этом случае у вас есть два варианта: блокировка 'LoadDataFromGameSmart' до завершения загрузки LoadData или использование метода обратного вызова' LoadDataFromGameSmart' (так же, как 'LoadData' делает) – Rob

+0

Я не совсем уверен, как сделать его блокирующим ... –