2014-11-27 3 views
0

저는 신속한 개발에 매우 ​​익숙합니다. 사과가이 안내서를 읽는 데 정말 바보 같은 질문이 있으면 사과드립니다. 내가 겪은 행동에 놀랐습니다. 작은 miffed).클래스 기반 스위프트 상수는 선택 사항 임

나는 클래스의 시작 부분에 초기화되지 않은 상수의 수를 정의하는 정말 간단한 클래스를 만들고 있습니다. 클래스가 초기화되면 값이 설정됩니다. 선택 사항이 아니며 생성자에서 모두 설정되어 있어도 상수를 선택적으로 선언하지 않으면이 작업을 수행 할 수없는 것처럼 보입니다. 예를 들면 :

class TestClass { 
    private let urlAddress:String 

    init(urlAddress: String) { 
     self.urlAddress = getUrlAddressWithProto("http", urlAddress:urlAddress) 
    } 

    func getUrlAddressWithProto(proto: String, urlAddress:String) -> String { 
     return "\(proto)://\(urlAddress)/" 
    } 
} 

비 선택적 문자열을 반환하지만 엑스 코드 오류가 발생 getUrlAddressWithProto 기능 : 오류 : 초기화되기 전에 사용 된 변수 'self.urlAddress을'

사람이 먼저 어떤 생각 이유에 있습니까 이 경우이며 모든 내 상수를 선택 사항으로 선언하는 데 적합한 대체 방법이 있습니까?

답변

3

아마도 컴파일러는 모든 비 선택적 변수가 초기화되기 전에 해당 함수를 호출 할 수 없다고 말하고 싶을 것입니다. 때로는 오류 메시지가 명확하지 않습니다.

Swift는 일관성없는 상태의 인스턴스 사용을 방지합니다. Swift는 호출 한 함수가 내부 상태에 의존하지 않는다는 것을 알지 못하므로 init이 수행되기 전에 인스턴스 함수를 호출 할 수 없습니다.

변수를 선택 사항으로 표시하는 것 외에 몇 가지 옵션이 있습니다.

  • 해당 기능을 클래스 기능으로 변환하십시오. 클래스 함수는 인스턴스에 바인딩되어 있지 않으므로 인스턴스 초기화가 완료되기 전에 호출 할 수 있습니다.
  • 코드를 함수에서 이니셜 라이저로 이동
  • 변수를 암시 적으로 래핑되지 않은 옵션으로 변환합니다. (즉, let urlAddress: String!). 해당 변수를 비 선택적 변수 인 것처럼 사용할 수 있습니다. 초기화하는 동안 설정했는지 확인하십시오. 프로그램이 종료되는 동안 무언가를하면 프로그램이 중단됩니다.

실제 코드에 따라 마지막 옵션이 유일한 실행 가능한 옵션 일 수 있습니다.

+0

감사합니다. 실제로 세 번째 옵션은 나에게 가장 적합하지만 첫 번째 옵션도 작동하도록 만들 수 있습니다. (여러 개의 초기화 프로그램이 있는데, 이것이 왜 함수의 사용인가?). – djbp

+1

여러 개의 inits가 모두 지정된 클래스 init을 호출 할 수 있습니다. 암시 적으로 래핑되지 않은 변수의 문제점은 변수를 nil로 설정할 수 있다는 것입니다. 그리고 만약 그렇다면 충돌을 일으킬 것입니다. – nhgrif

+0

같은 클래스 또는 수퍼 클래스에서 제안 하시겠습니까? 내 클래스는 다른 클래스를 하위 클래스로 만들지 않으며 객체가 초기화되는 방식에 따라 행 아래로 동작을 제어합니다. 이게 나쁜 습관이라고 제안하는거야? 내 inits가 다양한 상수/변수를 인스턴스화하도록 보장하는 한, 내가 뭘하고 있는지 확인하지 않습니까? – djbp