programing

Xcode 8.3 베타에서 "문자열 보간은 선택적인 값에 대한 디버그 설명을 생성합니다. 이것을 명시적으로 하려는 것입니까?"를 해결하는 방법은 무엇입니까?

testmans 2023. 8. 8. 20:06
반응형

Xcode 8.3 베타에서 "문자열 보간은 선택적인 값에 대한 디버그 설명을 생성합니다. 이것을 명시적으로 하려는 것입니까?"를 해결하는 방법은 무엇입니까?

베타 8.3 이후로 zillion 경고가 내 코드에 나타났습니다. "문자열 보간은 선택적인 값에 대한 디버그 설명을 생성합니다. 이것을 명시적으로 만들려는 의도였습니까?"

예를 들어 다음과 같은 상황에서 경고가 팝업되고 옵션이 0으로 이어질 수 있습니다.

let msg = "*** Error \(options["taskDescription"]): cannot load \(sUrl) \(error)"

이전에 설계된 대로, 나는 (그리고 컴파일러는) 옵션을 'nil'로 보간하는 것이 괜찮았습니다.하지만 컴파일러는 마음을 바꿨습니다.

컴파일러가 제안하는 것은 다음과 같은 설명을 가진 String 생성자를 추가하는 것입니다.

let msg = "*** Error \(String(describing: options["taskDescription"])): cannot load \(sUrl) \(error)"

분명히 결과는 명백하지만 제 생각에는 매우 번거롭습니다.더 좋은 방법이 있습니까?경고를 모두 수정해야 합니까, 아니면 다음 베타 버전을 기다리는 것이 좋습니까?

Screenshot for description

요청에서 변경된 사항은 인터폴링이Optional(...)결과 문자열에 들어가는 것은 종종 바람직하지 않으며, 특히 암묵적으로 포장되지 않은 옵션이 있는 경우에는 놀랄 수 있습니다.이 변경사항에 대한 자세한 내용은 메일 목록에서 확인할 수 있습니다.

처럼 (Xcode가 – 더 입니다.String(describing:)보간할 옵션 유형에 캐스트를 추가하는 것입니다. 예를 들어 다음과 같습니다.

var i: Int? = 5
var d: Double? = nil

print("description of i: \(i as Int?)")    // description of i: Optional(5)
print("description of d: \(d as Double?)") // description of d: nil

은 다과같일할수있도다습니화반이음다로 일반화될 수도 있습니다.as Optional:

print("description of i: \(i as Optional)") // description of i: Optional(5)
print("description of d: \(d as Optional)") // description of d: nil

스위프트 5에서는 SE-0228에 의해 도입된 새로운 문자열 보간 시스템을 사용하여 사용자 정의를 추가할 수 있습니다.appendInterpolation과부하:

extension DefaultStringInterpolation {
  mutating func appendInterpolation<T>(optional: T?) {
    appendInterpolation(String(describing: optional))
  }
}

var i: Int? = 5
var d: Double? = nil

print("description of i: \(optional: i)") // description of i: Optional(5)
print("description of d: \(optional: d)") // description of d: nil

그리고 파일 에서) .fileprivate):

extension DefaultStringInterpolation {
  mutating func appendInterpolation<T>(_ optional: T?) {
    appendInterpolation(String(describing: optional))
  }
}

var i: Int? = 5
var d: Double? = nil

print("description of i: \(i)") // description of i: Optional(5)
print("description of d: \(d)") // description of d: nil

비록 개인적으로 저는 논쟁의 꼬리표를 유지하는 것을 선호합니다.

이 문제를 해결하는 두 가지 쉬운 방법.

옵션 1:

첫 번째는 뱅(!)을 사용하여 반환할 값을 "강제로 포장 해제"하는 것입니다.

var someValue: Int? = 5
print(someValue!)

출력:

5

옵션 2:

더 나은 방법은 반환할 값을 "안전하게 포장 해제"하는 것입니다.

var someValue: Int? = 5

if let newValue = someValue {
    print(newValue)
}

출력:

5

옵션 2와 함께 사용하는 것이 좋습니다.

팁: 포장을 뜯을 가치가 항상 있을지 확신할 수 없기 때문에 가능한 한 강제로 포장을 뜯지 마십시오.

문자열(선택 사항 설명)을 사용하는 것이 가장 간단합니다.

기본값 ?문자열이 아닌 경우(예: Int)에는 의미가 없습니다.
Int가 0이면 로그에 다른 Int(예: 0)이 기본값이 아닌 'nil'로 표시되도록 합니다.

테스트할 일부 놀이터 코드:

var optionalString : String? = nil
var optionalInt : Int? = nil

var description_ = ""
description_ = description_ + "optionalString: \(String(describing: optionalString))\r"
description_ = description_ + "   optionalInt: \(String(describing: optionalInt))\r"

print(description_)

산출량

optionalString: nil
optionalInt: nil

Xcode 8.3으로 업데이트하고 많은 경고 메시지를 받은 후, 원래 출력 동작에 더 가깝고, 추가하기 쉬우며, 코드와 출력 모두에서 "String(설명:)"을 사용하는 장황함을 줄이는 다음과 같은 것을 생각해냈습니다.

기본적으로 선택사항에 있는 항목을 설명하는 문자열을 제공하는 선택적 확장자를 추가하거나 설정되지 않은 경우 단순히 "nil"을 추가합니다.또한 옵션에 있는 문자열이 문자열인 경우 따옴표로 묶습니다.

extension Optional {
    var orNil : String {
        if self == nil {
            return "nil"
        }
        if "\(Wrapped.self)" == "String" {
            return "\"\(self!)\""
        }
        return "\(self!)"
    }
}

놀이터에서의 사용:

var s : String?
var i : Int?
var d : Double?

var mixed = "s = \(s.orNil)    i = \(i.orNil)   d = \(d.orNil)" // "s = nil    i = nil   d = nil"

d = 3
i = 5
s = ""
mixed = "s = \(s.orNil)    i = \(i.orNil)   d = \(d.orNil)" // "s = ""    i = 5   d = 3.0"

s = "Test"
d = nil
mixed = "s = \(s.orNil)    i = \(i.orNil)   d = \(d.orNil)" // "s = "Test"    i = 5   d = nil"

다음 링크에서 도움을 주셔서 감사합니다.

check-if-type-is-옵션 및 what-type-it-timeout

이것에 대한 올레 베지만의 해결책을 참조하십시오.난 그것을 좋아해.다음을 생성합니다.???연산자는 다음과 같이 사용할 수 있습니다.

var someValue: Int? = 5
print("The value is \(someValue ??? "unknown")")
// → "The value is 5"
someValue = nil
print("The value is \(someValue ??? "unknown")")
// → "The value is unknown"

이 경고가 포함된 줄에 표시된 노란색 삼각형을 두 번 클릭합니다.그러면 FixIt와 두 가지 솔루션이 표시됩니다.

Screenshot added

  1. 사용하다String(describing:)이 경고를 잠재우기 위해:

    이것을 사용하면 그것은 될 것입니다.String(describing:<Variable>)

    예:String(describing: employeeName)

  2. 제공:default value이 경고를 방지하려면 다음과(와)

    이것을 사용하면 그것은 될 것입니다.(<Variable> ?? default value)

    예:employeeName ?? “Anonymous” as! String

스위프트 5

내 해결책은 다음을 만드는 것입니다.extension어느것이 포장을 풀어주는지Optional에 반대하는.Any.

개체를 로그에 기록하거나 인쇄할 때 실제 개체를 볼 수 있습니다.object또는<nil>⭕️(텍스트와 시각적 문자의 조합).특히 콘솔 로그에서 확인하는 것이 유용합니다.

extension Optional {
    var logable: Any {
        switch self {
        case .none:
            return "<nil>|⭕️"
        case let .some(value):
            return value
        }
    }
}

// sample
var x: Int?
print("Logging optional without warning: \(x.logable)")
// → Logging optional without warning: <nil>|⭕️

이름 없는 매개 변수가 있는 선택적 제네릭 유형을 허용하는 보간 방법을 만듭니다.당신의 성가신 경고들은 모두 마법처럼 사라질 것입니다.

extension DefaultStringInterpolation {
  mutating func appendInterpolation<T>(_ optional: T?) {
    appendInterpolation(String(describing: optional))
  }
}

언급URL : https://stackoverflow.com/questions/42543007/how-to-solve-string-interpolation-produces-a-debug-description-for-an-optional

반응형