이게 답인데
function getZombiesByOwner(address _owner) external view returns(uint[]) {
uint[] memory result = new uint[](ownerZombieCount[_owner]);
uint counter = 0;
for (uint i = 0; i < zombies.length; i++) {
if (zombieToOwner[i] == _owner) {
result[counter] = i;
counter++;
}
}
return result;
}
조금 헷갈리는 부분이 있어서 다시 리뷰해보면,
if 문 안의 i가 아니라 zombies.id로 넣어서 틀렸었다.
그 전에 코드를 제대로 이해하지 못해서 틀렸는데
uint배열이 생성될 때 길이는 (솔리디티에서는 memory 배열은 가스비 때문에 길이를 정해줘야한다)
ownerZombieCount[_owner] 라는 임포트한 코드 안에서
매핑으로 되어있는데 이것이 mapping (address ⇒ uint) 이기 때문에
주소를 넣으면 uint를 반환한다.
result는 해당 주소가 가지고 있는 좀비의 수 만큼의 배열이니,
for 문을 통해 조건문으로 전체 리스트(zombies)를 i번째와 주인이 같은지를 걸러내서
result의 counter번째마다 i를 넣어주고
몇개있는지 counter도 만족할 때마다 1씩 올려줘야한다
'BlockChain > Solidity' 카테고리의 다른 글
Klaytn IDE 에서 Deploy & Run 버튼이 보이지 않을 때 (1) | 2022.02.11 |
---|---|
Klaytn IDE를 이용한 NFT 배포, 개발하기 (8) | 2021.12.13 |