developer tip

Swift Dictionary에 nil 값을 추가하는 방법은 무엇입니까?

optionbox 2020. 12. 3. 07:46
반응형

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 값을 추가하는 방법이 있습니까?


nilSwift 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?

우리가 가지고 있음을 나타냅니다 아무것도 nilAnyObject?, 그리고 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)

nilSwift에서 사전에 값 을 추가하려면 사전의 값이 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

반응형