2015-01-24 3 views
3

그래서 클래스 함수와 "일반적인 인스턴스 함수"에 대해 궁금합니다. 클래스 함수의 목적이 무엇인지 알고 싶습니다. 먼저 변수를 클래스에 할당하지 않고 특정 함수를 사용할 수 있습니까? 아니면 다른 용도가 있습니까?스위프트 클래스 함수

class Dog { 
    func bark()->String{ 
     return "Woef Woef!" 
    } 
    class func bark_class()->String{ 
     return "Woef Woef!" 
    } 
} 

var dog = Dog() 
dog.bark() // Woef Woef! 

Dog.bark() // Throws and error 
Dog.bark_class() // Woef Woef! > Apparently is doens't need an initiated object 

답변

7

정적 메서드는 클래스의 인스턴스를 제공하지 않고 호출 할 수 있습니다 - 그들은 단지 클래스 유형이 필요합니다 그들은 어떤 경우에는 인스턴스가 정말 필요하지 않기 때문에이다 존재하는 이유

Dog.bark_class() 

이유를. 일반적으로 전역 함수로 클래스 외부로 이동할 수있는 인스턴스 메소드는 정적 메소드가 될 수있는 좋은 후보입니다. 메소드를 정적으로 만들 수 있는지 알아내는 또 다른 방법은 클래스의 속성이나 메소드를 참조하지 않으면 정적으로 만들 수 있습니다. 또 다른 명백한 차이점은 정적 메서드는 인스턴스 속성과 메서드에 직접 액세스 할 수 없다는 것입니다.이를 수행하려면 클래스의 인스턴스를 매개 변수로 전달하거나 본문에서 인스턴스화해야합니다.

인스턴스 방법은 자신의 첫 번째 매개 변수로 클래스 인스턴스를 복용 그들이 curried functions을있는 차이가 실제로 정적 메소드뿐만 아니라, 다음과 같습니다

var dog = Dog() 
Dog.bark(dog)() 

하지만 더 간결 기존의 구문을 사용하여 호출 할 수 있습니다 :

dog.bark() 

정적 메서드를 정의 할 때 대신 static 키워드가 사용된다는 점만 제외하면 클래스에 대해 명시 적으로 얘기했지만 구조체에도 유효합니다.

+0

bark_class()에서 bark()를 어떻게 호출합니까? 일단 클래스 함수가 ​​만들어지면, 클래스 내에서 다른 non clas 함수에 액세스하는 데 문제가 있습니다. – BlueGuy

+0

@BlueGuy 당신은 static/class 메쏘드 밖에서하는 것과 같은 방식으로 그것을 호출합니다 : 인스턴스 메쏘드가 되려면 인스턴스가 필요합니다. – Antonio

4

메소드 껍질을 호출하려면 클래스의 인스턴스를 만들어야합니다.

var instance = Dog() 

그런 다음 당신은 당신이 클래스 FUNC를 호출 할 때 인스턴스를 만들 필요가 없습니다 instance.bark()

말한다. 이다 방법이 있습니다 전술 한 바와 같이,

인스턴스 방법 :

Dog.bark_class() 

에의 Class 재미도 Type Method

애플 문서라고 : 당신처럼 당신은 단지 그것을 호출 할 수 있습니다 말했다 특정 유형의 인스턴스에서 호출됩니다. 또한 유형 자체에서 호출되는 메소드를 정의 할 수 있습니다. 이러한 종류의 메소드를 유형 메소드라고합니다. 메서드의 func 키워드 앞에 class 키워드를 작성하고 메서드의 func 키워드 앞에 static 키워드를 작성하여 구조 및 열거 형의 메서드를 입력하여 클래스의 형식 메서드를 나타냅니다.