Swift - 불투명 유형

11357 단어

불투명한 유형



불투명한 반환 유형을 가진 함수 또는 메서드는 반환 값의 유형 정보를 숨깁니다.
  • 유형이 프로토콜 유형인 값을 반환하는 것과 달리 불투명 유형은 유형 ID를 유지합니다. 컴파일러는 유형 정보에 액세스할 수 있지만 모듈의 클라이언트는 액세스할 수 없습니다.
  • 함수/메소드의 반환 유형을 불투명으로 선언하려면 some 키워드를 사용하십시오.

  • 예시 :

    protocol Shape {
        func draw() -> String
    }
    
    struct Triangle: Shape {
        var size: Int
        func draw() -> String {
            var result: [String] = []
            for length in 1...size {
                result.append(String(repeating: "*", count: length))
            }
            return result.joined(separator: "\n")
        }
    }
    
    struct Square: Shape {
        var size: Int
        func draw() -> String {
            let line = String(repeating: "*", count: size)
            let result = Array<String>(repeating: line, count: size)
            return result.joined(separator: "\n")
        }
    }
    
    let smallTriangle = Triangle(size: 3)
    



    struct FlippedShape<T: Shape>: Shape {
        var shape: T
        func draw() -> String {
            let lines = shape.draw().split(separator: "\n")
            return lines.reversed().joined(separator: "\n")
        }
    }
    
    struct JoinedShape<T: Shape, U: Shape>: Shape {
        var top: T
        var bottom: U
        func draw() -> String {
            return top.draw() + "\n" + bottom.draw()
        }
    }
    



    func flip<T: Shape>(_ shape: T) -> some Shape {
        return FlippedShape(shape: shape)
    }
    func join<T: Shape, U: Shape>(_ top: T, _ bottom: U) -> some Shape {
        JoinedShape(top: top, bottom: bottom)
    }
    
    let opaqueJoinedTriangles = join(smallTriangle, flip(smallTriangle))
    print(opaqueJoinedTriangles.draw())
    // *
    // **
    // ***
    // ***
    // **
    // *
    


    반환 유형이 불투명한 함수가 여러 위치에서 반환되는 경우 가능한 모든 반환 값의 유형이 동일해야 합니다. 일반 함수의 경우 해당 반환 유형은 함수의 일반 유형 매개변수를 사용할 수 있지만 여전히 단일 유형이어야 합니다.

    예 - 컴파일 오류:

    func makeShape(shape : String) ->  some Shape { // Function declares an opaque return type, but the return statements in its body do not have matching underlying types
        if(shape == "square"){
            print("here")
            return Square(size : 4)
        }else{
            return Triangle(size : 4)
        }
    
    
    }
    
    let shape =  makeShape(shape: "square")
    



    불투명 유형과 프로토콜 유형의 차이점


  • 일반 유형을 사용하면 함수를 호출하는 코드가 해당 함수의 매개 변수에 대한 유형을 선택하고 함수 구현에서 추상화된 방식으로 값을 반환할 수 있습니다
  • .
  • 불투명 유형을 사용하면 함수 구현에서 함수를 호출하는 코드에서 추상화된 방식으로 반환하는 값의 유형을 선택할 수 있습니다.
  • 불투명 유형은 하나의 특정 유형을 참조하지만 함수 호출자는 유형을 볼 수 없습니다.
  • 프로토콜 유형은 프로토콜을 준수하는 모든 유형을 참조할 수 있습니다.
  • Swift는 연결된 유형을 추론할 수 있으므로 프로토콜 유형을 반환 값으로 사용할 수 없는 위치에서 불투명한 반환 값을 사용할 수 있습니다.
  • 좋은 웹페이지 즐겨찾기