Swift Dictionary에 nil 값을 추가하는 방법은 무엇입니까?
내 앱에서 내 서버에 요청했습니다. 그리고 다음과 같은 게시 된 데이터. 서버 측은 모든 매개 변수가 nil이더라도 기다리고 있습니다. 하지만 사전에 nil 값을 추가 할 수 없었습니다.
var postDict = Dictionary<String,AnyObject>
postDict[pass]=123
postDict[name]="ali"
postDict[surname]=nil // dictionary still has only pass and name variables.
사전에 nil 값을 추가하는 방법이 있습니까?
nil
Swift Dictionary 에 가치 를 추가하는 방법은 무엇입니까?
기본적으로 다른 값을 사전에 추가하는 것과 같은 방법입니다. 먼저 값을 보유 할 수있는 값 유형을 가진 사전이 필요합니다. 유형 AnyObject
은 값을 가질 수 없습니다 nil
. 따라서 유형의 사전은 [String : AnyObject]
값을 가질 수 없습니다 nil
.
같은 선택적 유형 인 값 유형이있는 사전이있는 경우 값 [String : AnyObject?]
을 보유 할 수 있습니다 nil
. 예를 들면
let x : [String : AnyObject?] = ["foo" : nil]
첨자 구문을 사용하여 요소를 할당하려면 약간 까다 롭습니다. 유형의 아래 첨자에는 유형 [K:V]
이 V?
있습니다. 옵션은 for, 당신이 그것을 꺼낼 때, 그 키에 대한 항목이 있는지 여부를 나타내며, 그렇다면 값입니다. 입력하면 값을 설정하거나 항목을 제거 할 수 있습니다 (을 할당하여 nil
).
즉 [String : AnyObject?]
, 유형 사전의 경우 아래 첨자에 유형이 AnyObject??
있습니다. 다시 말하지만, 아래 첨자에 값을 입력 할 때 "outer"옵션을 사용하면 값을 설정하거나 항목을 제거 할 수 있습니다. 우리가 단순히 쓴다면
x["foo"] = nil
컴파일러는 외부 옵션 nil
인 type으로 추론합니다 . AnyObject??
이는 key에 대한 항목을 제거함을 의미합니다 "foo"
.
하기 위해 설정된 키 값을 "foo"
받는 AnyObject?
값으로 nil
, 우리는 비에서 전달해야 nil
(유형의 내부 선택적 함유 외부 옵션 AnyObject?
값을) nil
. 이를 위해 우리는 할 수 있습니다
let v : AnyObject? = nil
x["foo"] = v
또는
x["foo"] = nil as AnyObject?
우리가 가지고 있음을 나타냅니다 아무것도 nil
의 AnyObject?
, 그리고 AnyObject??
.
다음 updateValue
방법을 사용할 수 있습니다 .
postDict.updateValue(nil, forKey: surname)
여기에 설명 된 대로 nil
사전의 키 설정 은 요소 자체를 제거하는 것을 의미합니다.
예를 들어 null
변환 할 때 원하는 경우 JSON
다음을 사용할 수 있습니다.NSNull()
var postDict = Dictionary<String,AnyObject>()
postDict["pass"]=123
postDict["name"]="ali"
postDict["surname"]=NSNull()
let jsonData = NSJSONSerialization.dataWithJSONObject(postDict, options: NSJSONWritingOptions.allZeros, error: nil)!
let jsonString = NSString(data: jsonData, encoding: NSUTF8StringEncoding)!
// -> {"pass":123,"surname":null,"name":"ali"}
Optional
유형을 사용할 수 있습니다
var postDict = ["pass": 123, "name": "ali", "surname": Optional()]
postDict[surname] = Optional<AnyObject>(nil)
nil
Swift에서 사전에 값 을 추가하려면 사전의 값이 Optional
유형 이어야합니다 .
Person
수업을 고려하십시오 .
class Person {
let name: String
weak var spouse: Person?
init(name: String, spouse: Person?) {
self.name = name
self.spouse = spouse
}
}
Person
유형의 인스턴스 에는 name
및 선택적 spouse
. 두 개의 인스턴스를 만들고 첫 번째 인스턴스를 사전에 추가합니다.
let p1 = Person(name: "John", spouse: nil)
let p2 = Person(name: "Doe", spouse: p1)
p1.spouse = p2
var people = [p1.name: p1.spouse]
이 사전 (이라고 함 people
)은 이름을 배우자에게 매핑하며 유형은입니다 [String: Person?]
. 이제 값 Optional
유형 이있는 사전이 Person?
있습니다..
키의 값을 업데이트하려면 p1.name
이 될를 nil
, 사용 updateValue(_: forKey:)
상의 방법 Dictionary
유형입니다.
people.updateValue(nil, forKey: p1.name)
people[p1.name]
p1.name
이제 키 값 은 nil
입니다. updateValue(_: forKey:)
이 경우 사용 은 일회용 인스턴스를 만들고로 설정하고 nil
해당 인스턴스를 사전의 키에 할당하는 작업을 포함하지 않기 때문에 조금 더 간단 합니다.
NB :null
게시물 사전 에 삽입하려면 rintaro의 답변을 참조하십시오 .
var dict = [Int:Int?]()
dict[0] = (Int?).none // <--- sets to value nil
dict[0] = nil // <-- removes
dict[0] = .none // <-- same as previous, but more expressive
switch dict[0] {
case .none:
Swift.print("Value does not exist")
case .some(let value):
if let value = value {
Swift.print("Value exists and is", value)
} else {
Swift.print("Value exists and is nil")
}
}
Below dictionary will hold one key with nil value
var dict = [String:Any?]()
dict["someKey"] = nil as Any?
postDict[surname]=nil
When you use subscript to set nil. It deletes the key if exists. In this case key surname will be removed from dictionary if exists.
To set value as nil, there are certain ways.
postDict.updateValue(nil, forKey: surname)
or
let anyObjectNil : AnyObject? = nil
postDict[surname] = anyObjectNil
or
postDict[surname] = nil as AnyObject?
참고URL : https://stackoverflow.com/questions/26544573/how-to-add-nil-value-to-swift-dictionary
'developer tip' 카테고리의 다른 글
C # 열거 형에 값 포함 (0) | 2020.12.03 |
---|---|
WPF의 DataGridColumn에 대한 바인딩 가시성 (0) | 2020.12.03 |
C ++ 11 범위 기반 for 루프와 함께 OpenMP를 사용하십니까? (0) | 2020.12.02 |
C ++ 11 범위 기반 for 루프와 함께 OpenMP를 사용하십니까? (0) | 2020.12.02 |
이 코드가 Visual Studio 2015에서 충돌하는 이유는 무엇입니까? (0) | 2020.12.02 |