2014-11-23 14 views
10

W klasie Swift chcę użyć właściwości jako domyślnej wartości parametru dla metody tej samej klasy.Używanie właściwości jako domyślnej wartości parametru dla metody w tej samej klasie

Oto mój kod:

class animal { 
    var niceAnimal:Bool 
    var numberOfLegs:Int 

    init(numberOfLegs:Int,animalIsNice:Bool) { 
     self.numberOfLegs = numberOfLegs 
     self.niceAnimal = animalIsNice 
    } 

    func description(animalIsNice:Bool = niceAnimal,numberOfLegs:Int) { 
     // I'll write my code here 
    } 
} 

Problem polega na tym, że nie mogę używać mojego niceAnimal własności jako wartość domyślną funkcją, ponieważ wyzwala mi błąd kompilacji:

'animal.Type' nie ma elementu o nazwie 'niceAnimal'

jestem doin G coś nie tak? A może w Swift jest to niemożliwe? Jeśli to niemożliwe, czy wiesz dlaczego?

Odpowiedz

6

Nie sądzę, że robisz coś złego.

Specyfikacja języka mówi tylko, że parametr domyślny powinien znajdować się przed innymi niż domyślne parametrami (p169) i że domyślna wartość jest zdefiniowana przez wyrażenie (p637).

Nie określa, do czego to wyrażenie może się odwoływać. Wygląda na to, że nie można odwoływać się do instancji, do której wywołuje się metodę, tj. Do self, co wydaje się, że konieczne byłoby odwołanie się do self.niceAnimal.

Aby obejść ten problem, można zdefiniować domyślny parametr jako opcjonalny z domyślną wartością zerową, a następnie ustawić rzeczywistą wartość za pomocą wyrażenia "if let", które odwołuje się do zmiennej elementu w domyślnym przypadku, na przykład:

class animal { 
    var niceAnimal:Bool 
    var numberOfLegs:Int 

    init(numberOfLegs:Int,animalIsNice:Bool) { 
     self.numberOfLegs = numberOfLegs 
     self.niceAnimal = animalIsNice 
    } 

    func description(numberOfLegs:Int,animalIsNice:Bool? = nil) { 
     if let animalIsNice = animalIsNice ?? self.niceAnimal { 
     // println 

     } 
    } 
} 
+0

Dziękuję bardzo za odpowiedź. Jako rozwijający się, co myślisz o tym zachowaniu? –

+2

Nie jestem pewien. Sądzę, że domyślne wartości parametrów są miłym udogodnieniem, ale mogą również prowadzić do zaskakujących i złożonych przypadków narożnych związanych z oceną domyślnego wyrażenia. Wiem, że w Pythonie robi się nieprzyjemnie. Widzę więc cnotę zachowania tego w sposób jednoznaczny i ograniczony. Myślę, że obejście tego problemu nie jest takie złe. – algal

+0

OK Rozumiem, Apple prawdopodobnie chciało zachować to proste, wtedy ... –

0

Myślę, że na razie można używać literałów i właściwości typu jako domyślnych argumentów.

Najlepszym rozwiązaniem byłoby przeciążenie metody, a można wdrożyć krótszą wersję, dzwoniąc pełną. Użyłem tutaj tylko struktury, aby pominąć inicjator.

struct Animal { 

    var niceAnimal: Bool 
    var numberOfLegs: Int 

    func description(#numberOfLegs: Int) { 
     description(niceAnimal, numberOfLegs: numberOfLegs) 
    } 

    func description(animalIsNice: Bool, numberOfLegs: Int) { 
     // do something 
    } 

} 
Powiązane problemy