programing

선택변수인쇄

mailnote 2023. 11. 2. 22:01
반응형

선택변수인쇄

이 코드 라인으로 시도 중입니다.

class Student {
    var name: String
    var age: Int?

    init(name: String) {
        self.name = name
    }

    func description() -> String {
        return age != nil ? "\(name) is \(age) years old." : "\(name) hides his age."
    }
}

var me = Student(name: "Daniel")
println(me.description())
me.age = 18
println(me.description())

위 코드는 다음과 같이 생성됩니다.

Daniel hides his age.
Daniel is Optional(18) years old.

여기에 옵션(18)이 있는 이유는 무엇입니까? 옵션 및 인쇄만 제거하려면 어떻게 해야 합니까?

Daniel is 18 years old.

옵션이 무엇인지 이해해야 합니다.많은 스위프트 초보자들은 생각합니다.var age: Int?연령이 값을 가질 수도 있고 가지지 않을 수도 있는 Int임을 의미합니다.그러나 연령은 Int를 보유할 수도 있고 보유하지 않을 수도 있는 Optional임을 의미합니다.

너의 안에description()기능은 Int를 인쇄하지 않고 Optional을 인쇄합니다.Int를 인쇄하려면 Optional(옵션)의 포장을 풀어야 합니다."선택사항 바인딩"을 사용하여 [선택사항]의 포장을 해제할 수 있습니다.

if let a = age {
 // a is an Int
}

Optional(선택사항)이 개체를 고정하는 경우 "강제 언래핑"을 사용할 수 있습니다.

let a = age!

또는 예제에서 설명 함수에 0에 대한 검정이 이미 있으므로 다음과 같이 변경할 수 있습니다.

func description() -> String {
    return age != nil ? "\(name) is \(age!) years old." : "\(name) hides his age."
}

제거하기 위해서는 세 가지 방법을 사용할 수 있습니다.

  1. 유형이 확실한 경우 느낌표를 사용하여 다음과 같이 강제로 포장을 해제할 수 있습니다.

    // 선택 변수는 다음과 같습니다.

    variage: int?

    // 강제로 포장을 해제하는 방법은 다음과 같습니다.

    포장을 뜯은 다양한 연령 = 연령!

옵션의 포장을 강제로 해제하고 0과 같다면 다음과 같은 충돌 오류가 발생할 수 있습니다.

enter image description here

이것이 반드시 안전한 것은 아니기 때문에 종류와 값을 모르는 경우 충돌을 방지할 수 있는 방법은 다음과 같습니다.

방법 2 및 방법 3은 이 문제로부터 보호합니다.

  1. 암묵적으로 포장되지 않은 옵션

    포장을 뜯으면 나이 = 나이 {

    // 여기서 계속

    }

포장되지 않은 유형은 이제 Int?이 아니라 Int?입니다.

  1. 경비원 진술서가

    guardletwrapedAge = age other { // 여기서 계속}

여기서부터는 포장되지 않은 변수를 사용할 수 있습니다.변수 유형이 확실한 경우에는 강제로 포장을 해제해야 합니다(!).

프로젝트에 행운을 빌어요!

테스트/디버깅 목적으로 항상 테스트할 필요 없이 옵션을 문자열로 출력하고자 하는 경우가 많습니다.nilvalues, 그래서 사용자 지정 연산자를 만들었습니다.

저는 다른 질문에서 이 답변을 읽고 더 발전했습니다.

fileprivate protocol _Optional {
    func unwrappedString() -> String
}

extension Optional: _Optional {
    fileprivate func unwrappedString() -> String {
        switch self {
        case .some(let wrapped as _Optional): return wrapped.unwrappedString()
        case .some(let wrapped): return String(describing: wrapped)
        case .none: return String(describing: self)
        }
    }
}

postfix operator ~? { }
public postfix func ~? <X> (x: X?) -> String {
    return x.unwrappedString
}

당연히 연산자(및 연산자의 속성)를 사용자의 기호에 맞게 조정하거나 대신 함수로 만들 수 있습니다.어쨌든 이를 통해 다음과 같은 간단한 코드를 작성할 수 있습니다.

var d: Double? = 12.34
print(d)     // Optional(12.34)
print(d~?)   // 12.34
d = nil
print(d~?)   // nil

다른 사람의 프로토콜 아이디어를 통합하면 중첩된 옵션에서도 작동할 수 있습니다. 이러한 옵션은 옵션 체인을 사용할 때 종종 발생합니다.예를 들어,

let i: Int??? = 5
print(i)              // Optional(Optional(Optional(5)))
print("i: \(i~?)")    // i: 5

갱신하다

간단히 사용me.age ?? "Unknown age!". 3.0.2에서 작동합니다.

오래된 대답

강제로 래핑을 해제하지 않으면(0인 경우 마하 신호/충돌 없음) 또 다른 좋은 방법은 다음과 같습니다.

(result["ip"] ?? "unavailable").description.

result["ip"] ?? "unavailable"일도 해야 하지만, 그렇지 않아요, 적어도 2.2 안에는.

물론 "사용할 수 없음"을 "nil", "not found" 등 자신에게 맞는 것으로 대체합니다.

선택적 사용의 포장을 해제하려면age!대신에age. 현재 다음과 같은 옵션 값을 인쇄하고 있습니다.nil. 그래서 그것은 그것으로 포장된 것입니다.Optional.

속히Optional할 수 있는 것입니다.nil경우에 따라서는만약 당신이 100% 확신한다면 a.variable항상 약간의 가치가 있을 것이고 돌아오지 않을 것입니다.nil덧셈!강제로 포장을 뜯을 수 있는 변수가 있습니다.

그 외의 경우, 가치에 대한 확신이 없으면 다음을 추가합니다.if let막아서거나guard값이 존재하는지 확인하기 위해 그렇지 않으면 충돌이 발생할 수 있습니다.

위해서if let블록:

if let abc = any_variable {
 // do anything you want with 'abc' variable no need to force unwrap now.
}

위해서guard문장:

guard는 조건이 충족되지 않을 경우 컨트롤을 반환하는 조건부 구조입니다.

나는 사용하는 것을 선호합니다.guard위에if let우리가 그것을 돌려줄 수 있기 때문에 많은 상황에서 블록.function특정 값이 존재하지 않는 경우.변수가 반드시 존재해야 하는 함수가 존재할 때와 마찬가지로, 우리는 guard statement에서 변수를 확인할 수 있고, 변수의 반환은 존재하지 않습니다. i-e;

guard let abc = any_variable else { return }

변수가 존재할 경우 보호 범위 밖의 함수에서 'abc'를 사용할 수 있습니다.

age는 옵션 유형입니다.Optional<Int>따라서 0과 비교하면 값이 있거나 값이 없으면 매번 false를 반환합니다.값을 얻으려면 옵션의 포장을 풀어야 합니다.

예제에서는 값이 포함되어 있으므로 이 값을 대신 사용할 수 있습니다.

if let myAge = age {
    // there is a value and it's currently undraped and is stored in a constant
}
else {
   // no value
}

다른 뷰 컨트롤러에서 문자열(속성) 값을 인쇄하기 위해 이 작업을 수행했습니다.

ViewController.swift

var testString:NSString = "I am iOS Developer"

SecondViewController.swift

var obj:ViewController? = ViewController(nibName: "ViewController", bundle: nil)
print("The Value of String is \(obj!.testString)")

결과:

The Value of String is I am iOS Developer

확인해보세요.guard문:

for student in class {
    guard let age = student.age else { 
        continue 
     }
    // do something with age
}

기본값을 가질 경우:

print("\(name) is \(age ?? 0) years old")

또는 이름이 선택 사항인 경우:

print("\(name ?? "unknown") is \(age) years old")

테이블뷰 셀에서 선택사항("String")을 얻고 있었습니다.

첫 번째 답은 훌륭합니다.그걸 알아내는데 도움이 됐어요여기 제가 한 일이 있습니다. 저와 같은 신인들을 돕기 위해서요.

사용자 지정 개체에 배열을 만들기 때문에 항상 첫 번째 위치에 항목이 있으므로 다른 변수로 강제로 포장을 해제할 수 있습니다.그런 다음 해당 변수를 사용하여 인쇄하거나 내 경우 테이블 보기 셀 텍스트로 설정합니다.

let description = workout.listOfStrings.first!
cell.textLabel?.text = description

지금은 간단해 보이지만, 제가 알아내는데 시간이 좀 걸렸습니다.

이것은 이 질문에 대한 정확한 답이 아니라, 이런 종류의 문제에 대한 한 가지 이유입니다.제 경우에는 "iflet"과 "guardlet"이 있는 문자열에서 Optional을 제거할 수 없었습니다.

따라서 Any 대신 AnyObject를 사용하여 문자열에서 옵션을 빠르게 제거합니다.

답변은 링크를 참조해주시기 바랍니다.

https://stackoverflow.com/a/51356716/8334818

만약에 당신이 끈을 없애고 싶다면, 예를 들어.Optional(xxx)그리고 대신에.xxx아니면nil로그와 같은 값을 어딘가에 인쇄할 때 코드에 다음 확장자를 추가할 수 있습니다.

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

그러면 다음 코드:

var x: Int?

print("x is \(x.orNil)")

x = 10

print("x is \(x.orNil)")

다음을 제공합니다.

x is nil
x is 10

PS. 속성 이름 지정(orNil)이 최선은 아니지만 더 이상 명확한 것을 생각해 낼 수 없습니다.

다음 코드를 사용하여 인쇄하거나 기본값을 인쇄할 수 있습니다.XCode에서 일반적으로 추천하는 것입니다.

var someString: String?

print("Some string is \(someString ?? String("Some default"))")

직접 인쇄할 수는 없지만 UUID와 같은 '투프린터블(to-printable)' 유형의 방법이 있는 일부 옵션을 인쇄하는 경우 다음과 같은 작업을 수행할 수 있습니다.

print("value is: \(myOptionalUUID?.uuidString ?? "nil")")

예를 들면

    let uuid1 : UUID? = nil
    let uuid2 : UUID? = UUID.init()
    
    print("uuid1: \(uuid1?.uuidString ?? "nil")")
    print("uuid2: \(uuid2?.uuidString ?? "nil")")

-->

uuid1: nil
uuid2: 0576137D-C6E6-4804-848E-7B4011B40C11

언급URL : https://stackoverflow.com/questions/25846561/printing-optional-variable

반응형