programing

입력 루프에 주조 입력

codeshow 2023. 10. 4. 23:05
반응형

입력 루프에 주조 입력

나는 이 포인 루프를 가지고 있습니다.

for button in view.subviews {
}

이제 버튼을 사용자 지정 클래스에 캐스트하여 속성을 사용할 수 있도록 하겠습니다.

나는 이것을.for button in view.subviews as AClass

하지만 작동하지 않아 오류가 발생합니다.'AClass' does not conform to protocol 'SequenceType'

그리고 나는 이것을 시도했습니다.for button:AClass in view.subviews

하지만 그것도 효과가 없습니다.

Swift 2 이상의 경우:

Swift 2는 for 루프케이스 패턴을 추가하여 for 루프에 주조물을 보다 쉽고 안전하게 입력할 수 있습니다.

for case let button as AClass in view.subviews {
    // do something with button
}

Swift 1.2 이전 버전에서 할 수 있었던 것보다 이것이 더 나은 이유는 무엇입니까?대소문자 패턴을 사용하면 컬렉션에서 특정 유형을 선택할 수 있기 때문입니다.원하는 유형에만 일치하므로 배열에 혼합물이 포함되어 있으면 특정 유형에 대해서만 작업할 수 있습니다.

예를 들어,

let array: [Any] = [1, 1.2, "Hello", true, [1, 2, 3], "World!"]
for case let str as String in array {
    print(str)
}

출력:

Hello
World!

Swift 1.2의 경우:

이 경우, 당신은 캐스팅입니다.view.subviews아닌button, 따라서 원하는 유형의 배열로 다운캐스트해야 합니다.

for button in view.subviews as! [AClass] {
    // do something with button
}

참고: 기본 배열 유형이 그렇지 않은 경우[AClass], 이것은 충돌할 것입니다.그것이 바로 그것입니다.!위에as!당신에게 말해주고 있는 겁니다.종류가 확실하지 않다면 조건부 캐스트를 사용할 수 있습니다.as?선택적 구속력과 함께if let:

if let subviews = view.subviews as? [AClass] {
    // If we get here, then subviews is of type [AClass]
    for button in subviews {
        // do something with button
    }
}

Swift 1.1 이전 버전의 경우:

for button in view.subviews as [AClass] {
    // do something with button
}

참고: 하위 보기가 모두 유형이 아닌 경우에도 충돌이 발생합니다.AClass. 위에 나열된 안전 방법은 이전 버전의 Swift에서도 작동합니다.

이 옵션은 보다 안전합니다.

for case let button as AClass in view.subviews {
}

또는 신속한 방법:

view.subviews
  .compactMap { $0 as AClass }
  .forEach { .... }

제시된 답변이 맞습니다, 저는 이것을 추가로 추가하고 싶었을 뿐입니다.

for loop with for for for for for for casting(힘 주조)을 사용할 경우 코드가 충돌합니다(다른 사람들이 이미 언급한 바와 같이).

for button in view.subviews as! [AClass] {
    // do something with button
}

하지만 if 절 대신에

if let subviews = view.subviews as? [AClass] {
    // If we get here, then subviews is of type [AClass]
    ...
}

또 다른 방법은 while-loop을 사용하는 것입니다.

/* If you need the index: */
var iterator = view.subviews.enumerated().makeIterator()
while let (index, subview) = iterator.next() as? (Int, AClass) {
    // Use the subview
    // ...
}

/* If you don't need the index: */
var iterator = view.subviews.enumerated().makeIterator()
while let subview = iterator.next().element as? AClass {
    // Use the subview
    // ...
}

배열의 일부 요소(모든 요소는 아님)가 유형일 수 있다면 더 편리할 것으로 보입니다.AClass.

지금으로서는(스위프트 5 기준) 포 케이스 루프를 선택하고 싶습니다.

for case let (index, subview as AClass) in view.subviews.enumerated() {
    // ...
}

for case let subview as AClass in view.subviews {
    // ...
}

당신은 또한 a를 사용할 수 있습니다.where절을

for button in view.subviews where button is UIButton {
    ...
}

이를 통해 주조 작업을 수행함과 동시에 안전을 보장할 수 있습니다.

for button in view.subviews.compactMap({ $0 as? AClass }) {

}

vacawama가 제공한 답변은 Swift 1.0에서 맞았습니다.그리고 스위프트 2.0에서는 더 이상 작동하지 않습니다.

시도하면 다음과 같은 오류가 발생합니다.

'[AnyObject]'은(는) '[ACLass]'로 변환할 수 없습니다.

Swift 2.0에서는 다음과 같이 써야 합니다.

for button in view.subviews as! [AClass]
{
}

루프에 인덱스를 포함시키려면 다음을(를)

for case let (index, button as AClass) in view.subviews.enumerated() {
}

언급URL : https://stackoverflow.com/questions/26076772/type-casting-in-for-in-loop

반응형