Swift 클래스의 정적 및 클래스 함수 / 변수?
다음 코드는 Swift 1.2에서 컴파일됩니다.
class myClass {
static func myMethod1() {
}
class func myMethod2() {
}
static var myVar1 = ""
}
func doSomething() {
myClass.myMethod1()
myClass.myMethod2()
myClass.myVar1 = "abc"
}
정적 함수와 클래스 함수 의 차이점은 무엇입니까 ? 어느 것을 언제 사용해야합니까?
다른 변수를 정의하려고하면 다음 class var myVar2 = ""
과 같이 말합니다.
클래스에서 아직 지원되지 않는 클래스 저장 속성; '정적'을 의미 했습니까?
이 기능이 지원되면 정적 변수와 클래스 변수 의 차이점은 무엇입니까 (즉, 둘 다 클래스에 정의 된 경우)? 어느 것을 언제 사용해야합니까?
(Xcode 6.3)
static
그리고 class
클래스와 연관 시키 두 방법보다는 클래스의 인스턴스. 차이점은 서브 클래스가 class
메소드 를 대체 할 수 있다는 것입니다 . static
메소드를 대체 할 수 없습니다 .
class
프로퍼티는 이론적으로 같은 방식으로 작동하지만 (서브 클래스가이를 오버라이드 할 수는 있지만) 스위프트에서는 아직 불가능합니다.
놀이터에 대한 mipadi의 답변과 의견을 시도했습니다. 그리고 그것을 공유 할 생각. 여기 요 mipadi의 대답은 받아 들인 것으로 표시되어야한다고 생각합니다.
class A{
class func classFunction(){
}
static func staticFunction(){
}
class func classFunctionToBeMakeFinalInImmediateSubclass(){
}
}
class B: A {
override class func classFunction(){
}
//Compile Error. Class method overrides a 'final' class method
override static func staticFunction(){
}
//Lets avoid the function called 'classFunctionToBeMakeFinalInImmediateSubclass' being overriden by subclasses
/* First way of doing it
override static func classFunctionToBeMakeFinalInImmediateSubclass(){
}
*/
// Second way of doing the same
override final class func classFunctionToBeMakeFinalInImmediateSubclass(){
}
//To use static or final class is choice of style.
//As mipadi suggests I would use. static at super class. and final class to cut off further overrides by a subclass
}
class C: B{
//Compile Error. Class method overrides a 'final' class method
override static func classFunctionToBeMakeFinalInImmediateSubclass(){
}
}
OOP 와 관련 하여 대답은 너무 간단합니다.
서브 클래스는 클래스 메소드 를 대체 할 수 있지만 정적 메소드는 대체 할 수 없습니다 .
게시물 외에도 클래스 변수 를 선언 하려면 (처럼 class var myVar2 = ""
) 다음과 같이해야합니다.
class var myVar2: String {
return "whatever you want"
}
내 프로젝트 중 하나 에서이 혼란을 겪었고이 게시물이 매우 유용하다는 것을 알았습니다. 내 놀이터에서 똑같이 시도했고 여기에 요약이 있습니다. 이 저장 특성과 유형의 기능을 가진 사람 도움이되기를 바랍니다 static
, final
, class
, 오버라이드 (override) 클래스는 바르 등
class Simple {
init() {print("init method called in base")}
class func one() {print("class - one()")}
class func two() {print("class - two()")}
static func staticOne() {print("staticOne()")}
static func staticTwo() {print("staticTwo()")}
final func yesFinal() {print("yesFinal()")}
static var myStaticVar = "static var in base"
//Class stored properties not yet supported in classes; did you mean 'static'?
class var myClassVar1 = "class var1"
//This works fine
class var myClassVar: String {
return "class var in base"
}
}
class SubSimple: Simple {
//Successful override
override class func one() {
print("subClass - one()")
}
//Successful override
override class func two () {
print("subClass - two()")
}
//Error: Class method overrides a 'final' class method
override static func staticOne() {
}
//error: Instance method overrides a 'final' instance method
override final func yesFinal() {
}
//Works fine
override class var myClassVar: String {
return "class var in subclass"
}
}
다음은 테스트 샘플입니다.
print(Simple.one())
print(Simple.two())
print(Simple.staticOne())
print(Simple.staticTwo())
print(Simple.yesFinal(Simple()))
print(SubSimple.one())
print(Simple.myStaticVar)
print(Simple.myClassVar)
print(SubSimple.myClassVar)
//Output
class - one()
class - two()
staticOne()
staticTwo()
init method called in base
(Function)
subClass - one()
static var in base
class var in base
class var in subclass
Swift 4의 테스트는 시뮬레이터의 성능 차이를 보여줍니다. "class func"로 수업을 만들고 "static func"로 구조체를 만들어 테스트했습니다.
정적 기능은 다음과 같습니다.
- 컴파일러 최적화없이 20 % 빨라짐
- 최적화-전체 모듈 최적화가 활성화되면 38 % 더 빠릅니다.
그러나 iOS 10.3의 iPhone 7에서 동일한 코드를 실행하면 정확히 동일한 성능을 나타냅니다.
다음은 Swift 4에서 Xcode 9 용 샘플 프로젝트입니다. https://github.com/protyagov/StructVsClassPerformance
차이점이 하나 더 있습니다. 계산 된 유형class
의 유형 속성을 정의하는 데만 사용할 수 있습니다 . 당신은 필요한 경우 저장 type 속성의 사용을 static
대신.
정적 응답은 정적 디스패치입니다. 정적 메소드는 정적 메소드를 재정의 할 수 없기 때문에 런타임에 어떤 메소드가 실행 될지 알 수 있습니다.
모두 static
와 class
키워드는 우리가 변수를 첨부 할 수있는 클래스 가 아닌 클래스의 인스턴스. 경우 self
클래스에 액세스하고,이를 실제 클래스 (아닌 경우)을 지칭한다.
변하기 쉬운
a를 만들면 static property
클래스가 소유하고 하위 클래스로 변경할 수 없지만 사용 class
하면 필요할 때 재정의 될 수 있습니다.
함수
Static
기능을 재정의 할 수 없습니다.static
~와 같다class final
Class
함수 (인스턴스 메서드가 아닌)도 정적 함수이지만 동적으로 전달되며 정적 함수와 달리 하위 클래스로 재정의 될 수 있습니다.Global
기능은 요구 사항에 따라 프로젝트로 가져올 수있는 별도의 파일로 보관할 수 있습니다. 의 경우static
우리는 정적 멤버 중 하나에 액세스하는 경우 기능, 전체 클래스는 메모리에로드됩니다. 그러나global
기능의 경우 해당 특정 기능 만 메모리에로드됩니다.
참고 URL : https://stackoverflow.com/questions/29636633/static-vs-class-functions-variables-in-swift-classes
'Programming' 카테고리의 다른 글
GitHub 플레이 버드 마크 다운을 렌더링하기위한 명령 줄 유틸리티가 있습니까? (0) | 2020.02.22 |
---|---|
파이썬에서 다른 파일에서 함수 호출 (0) | 2020.02.22 |
Mockito가 여러 번 호출되는 메소드의 인수를 캡처 할 수 있습니까? (0) | 2020.02.22 |
Go에서 두 조각을 연결 (0) | 2020.02.22 |
android : onClick XML 속성이 setOnClickListener와 정확히 어떻게 다릅니 까? (0) | 2020.02.22 |