NDC/Dev
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
MAKGA
2023. 1. 15. 21:50
320x100
LINK(Language Integrated Query): 데이터 저장소 종류와 관계 없이 저장소에 일관성 있는 인터페이스로 질의
- 동일한 인터페이스 사용
- 다양하고 편리한 기능 (Max, Min, Average, OrderBy, First ...)
- 지연 실행 (성능 이점)
- 간결한 High Level 코드 품질
- 컴파일 타임 에러 체크
int[] numbers = { 5, 10, 8, 3, 6, 12 };
Query syntax
var result = from num in numbers
where num % 2 == 0
orderby num
select num * 2;
Method syntax
var result = numbers
.Where(num => num % 2 == 0)
.OrderBy(num => num)
.Select(num => num * 2);
사용 예시
1) 퀘스트들의 제목을 출력해주세요
2) 입장한 맵에 해당되는 퀘스트들만 보여줍니다
3) 현재 진행 중이어야 하고요
4) 진행 상태가 높은 퀘스트를 가장 먼저 출력합니다.
5) 진행 상태가 같은 경우 퀘스트 아이디가 낮은 순서로 출력합니다.
Non LINQ
List<Quest> result = new List<Quest>();
foreach (Quest quest in quests)
{
if (quest.isActive)
{
if (quest.MapIndex == currentMapIndex)
results.Add(quest);
}
}
results.Sort((x, y) =>
{
int compareValue = y.Progress.CompareTo(x.Progress);
if (compareValue == 0)
return x.ID.CompareTo(y.ID);
return compareValue;
});
LINQ
var result = quests
.Where(quest => quest.IsActive)
.Where(quest => quest.MapIndex == currentMapIndex)
.OrderByDescending(quest => quest.Progress)
.ThenBy(quest => quest.ID);
IOS 환경에서 LINQ를 사용할 수 없는 이유는 LINQ 자체의 결함이 아니라 mono AOT 컴파일러의 버그가 원인!
해결 방법
IL2CPP (IOS 64bit 지원을 위해서 반드시 사용)
UniLinq (https://github.com/RyotaMurohoshi/UniLinq): 낮은 버전의 Unity를 사용해야 한다면 Third party 사용
출처: http://ndcreplay.nexon.com/NDC2016/sessions/NDC2016_0047.html
320x100