2014-10-01 4 views
0

Swift에서 기본 함수 매개 변수를 정의하려고합니다. 기본적으로이 클래스 내의 참조가 사용되어야합니다 (함수 loadMyEntities(...)). Xcode (v6 베타 4)는 Use of unresolved Identifier 'self'을 표시합니다. self.context 대신 context 만 사용하면 'DB.Type' does not have a member named 'context' 오류가 발생합니다. "참조 뒤에있는 값"을 기본 매개 변수로 사용하려면 어떻게해야합니까?Swift : 기본 함수 매개 변수로 클래스 매개 변수

내 구체적인 경우 코어 데이터는 별도로 생성 된 NSManagedObjectContext 또는 기본 컨텍스트에서 엔티티를로드해야합니다.

class DB { 
    var appDelegate: AppDelegate 
    var context: NSManagedObjectContext 
    var persistenceCoordinater: NSPersistentStoreCoordinator 

    init() { 
    self.appDelegate = UIApplication.sharedApplication().delegate as AppDelegate 
    self.context = appDelegate.managedObjectContext! 
    self.persistenceCoordinater = context.persistentStoreCoordinator 
    } 

    // !!! Here's the point where I want to use the DB objects context as default !!! 
    func loadMyEntities(context: NSManagedObjectContext = self.context) -> [MyEntity] { 
    // loading entities 
    } 

    // This function can be used 
    func createContext() -> NSManagedObjectContext { 
    var newContext = NSManagedObjectContext() 
    newContext.persistentStoreCoordinator = self.persistenceCoordinater 
    return newContext 
    } 
} 

해결 방법은 주어진 컨텍스트없이 하나 한번없이 한번 파라미터와, 두 함수를 정의하고, 대표된다. 빠른 경우

func loadMyEntities() -> [MyEntity] { 
    return loadMyEntities(self.context) 
} 

func loadMyEntities(context: NSManagedObjectContext) -> [MyEntity] { 
    // loading entities 
} 

는하지만 그 매개 변수 사용에

내 질문 목표 ;-) 꽤 좋은 건 아니지만, 이런 식으로 핵심 데이터를 캡슐화하는 의견도 환영합니다.

+0

왜 이전 beta4 대신 Xcode6의 최종 버전을 사용하지 않았습니까? – holex

+0

은 새 프로젝트를 시작하기 전에 최신 버전을 다운로드했습니다. 버전 6A317을 지금 시험해보십시오. 동일한 동작입니다. – Guardian667

답변

2

는하지만 그 오버로드 접근 방식에 아무 문제가 없다 ;-)

꽤 좋은 아니에요. 매우 명확하고 유연합니다. 그것이 바로 과부하입니다. 지금까지 여러 번이 문제에 직면 해 있었으며 과도하게 복잡한 기본값이 잘못된 해결책이라는 것을 상기시켜 왔습니다. 스위프트는 이유 때문에 과부하가 있습니다. 그들은 여기서 정확하게 문제를 해결합니다.

기본 매개 변수는 과부하를 나타내는 바로 가기입니다. 바로 가기를 얼마나 멀리 밀 수 있는지에 대한 제한이 있습니다.


편집 :이 특정 경우에, 자연 솔루션은 옵션에 매개 변수를 변환하는 것입니다 (무슨 뜻 정확히 무엇이다, 그것은 선택 사항입니다).

func loadMyEntities(context: NSManagedObjectContext? = nil) -> [MyEntity] { 
    if let context = context ?? self.context { 
     ... 
    } 
} 
+0

절대적으로 동의하십시오. 어쩌면 나는 모든 함수를 두 번 구현하는 프로그래밍 노력을 제거하고 자동 완성 목록에 표시된 함수의 양을 존중함으로써 동기 부여를 얻었을 수도 있습니다. – Guardian667

+0

(위의 if-let-??은 컴파일 될 것입니다. 매우 비슷한 것이 있어야합니다.) –

+0

빈 중괄호로 작동합니다. 솔루션이 아니더라도 과부하보다 덜 비싼 해결 방법입니다. – Guardian667

관련 문제