nil, Nil, NSNull, Null에 대한 고찰
오랜만에 포스팅이네요,,
문득 일하던 중 API 요청을 하기 위해 필드의 값을 nullable하게 하는 것이 좋은 코드인가..?
아니면 값을 비워두거나, 필드 자체를 없애버리는게 좋은 코드인지에 대한 의문이 들었다
여기서 생각이 꼬리를 물고 Alamofire에서 API요청을 보내기 위해 필드에 nil값을 집어넣으면 어떻게 될지 궁금했다
예를들어
다음과 같은 json을 post하기 위해 서버로 Alamofire를 통해 보내보면...
{
"idx": "1"
"name": "Thomas"
"phone_number": nil
"age": 29
}
결론적으로, Alamofire에서는 필드의 값이 nil일 경우 아예 필드자체가 없는 것으로 판단한다.
그런데 나는 회사 서버와의 상호작용간 특성상 파라미터를 String형의 배열로 바꿔서 무조건 보내고 있었는데, 처음에 nil자체를 String "nil"로 계속 보내고 있길래 원래 nil을 서버와 주고받을 때 String으로 주고받나 착각을 했었다.
이와 더불어서, 에전에 null값을 서버로부터 받았을 때, NSNull이라는 객체로 내려오는 것을 확인할 수 있었는데, 이는 엄밀히 말하면 Swift에서 nil이 아니다. NSNull이라는 "객체"인 것이다.
이때는 NSNull을 nil로 변환해주는 작업이 필요하다.
func nullToNil(value : Any?) -> Any? {
if value is NSNull {
return nil
} else {
return value
}
}
마지막으로 제목에서 언급한 nil, null, NSNull, Nil에 대해서 정리를 하자면 다음과 같다.
1. nil (Swift)
- Swift에서 nil은 옵셔널로 선언된 값이 없음을 나타냄
- 값을 아예 가지고 있지 않은 상태
2. null(Objective-C)
- Objective-C에서 null은 객체가 없음을 나타냄
- Objective-C에서도 nil이 쓰이는데, 여기서 nil과 null은 동일하게 사용됨
3. NSNull(Objective-C)
- Objective-C에서 객체 컬렉션(NSArray, NSDictionary 등)에 nil을 포함시키기 위한 클래스
- Objective-C에서는 배열이나 딕셔너리같은 컬렉션에 nil을 직접 넣을 수 없기 때문에 NSNull을 사용해서 nil을 나타냄
4. Nil(Objective-C)
- Nil은 Objective-C에서 클래스 타입의 null값을 나타냄
- nil은 객체(포인터)가 없음을 나타내는데 비해, Nil은 클래스 타입의 널을 나타냄.
기본적인 내용일 수 있지만 기본적인 것일수록 탄탄해야하기에 정리해봤다.
틀린 내용이 있으면 알려주세요!