-
[Swift] static 함수와 class 함수! static func vs class func앱등이에게 살충제를 뿌린다./Swift 2016. 7. 20. 00:27
class func vs static func
Objective-C를 사용하면 함수를 선언할 때, 플러스(+)부호와 마이너스(-)부호를 붙여준다.
+부호는 클래스메소드, -부호는 인스턴스메소드.
즉, -부호를 붙인 메소드는 객체를 생성해야만 사용할 수 있고, +부호는 객체가 아닌 클래스를 통해 호출하는 메소드이다.
이와 유사한 작동이 Swift에서도 물론 제공된다.
바로 static키워드와 class키워드이다.
생긴건 유사해 보인다.
두 키워드의 기능에 대한 설명은 생략하고 차이점에 대해서 짚어보도록 한다.
Q. static func와 class func의 차이점은 무엇인가요?
보기엔 static은 struct, enum에서 선언할 때 사용하고 class은 클래스나 프로토콜에서 사용하는것처럼 보이는데요.. 맞나요?
자 지금부터 확인들어가것습니다잉~
A. 네, 사실입니다. 그 또한 차이점이라고 할 수 있겠습니다.
하지만 외에도 주요한 차이점들이 존재합니다. class으로 선언한 메소드들은 동적으로 dispatch되거나 서브클래스에서 override할 수 있습니다. static은 되지 않겠죠.
예제를 보도록 합시다.
이 예제에서 class타입은 override할 수 있지만, static타입은 컴파일 에러를 발생시키네요.
static타입 선언은 class final선언과 같다고 볼 수 있습니다.
'앱등이에게 살충제를 뿌린다. > Swift' 카테고리의 다른 글
[Swift] Swift로 유닛테스트를 하려면? How to Unit-test in Swift? (0) 2017.01.09 [Raywenderlich] Swift3에서 달라진 점 ( What's new in Swift3? ) (0) 2017.01.01 [Swift] static 함수와 class 함수! static func vs class func (7) 2016.07.20 [Swift] String의 subString을 subscript로 구현해보자. (0) 2016.05.01 [Swift] Objective-C 오픈소스(AFNetworking 2.0)를 Swift에 적용시켜보자 (0) 2016.03.21 [Swift] 타입 캐스팅 (0) 2015.12.22 TAG
다른 swift 파일에 있는 클래스 내 메소드는 어떻게 호출해야 하나요?
클래스이름.메소드() 로 하니 에러가 나네요..ㅠㅜ
안녕하세요~
다른 Swift파일에 있는 클래스이름을 CClass라고 합시다.
그러면 이런코드가 적히겠네요
class CClass {
let str = "String"
func printString() {
print(str)
}
}
그렇다면 CClass의 printString메소드를 호출하려면 어떻게 해야할까요?
CClass.printString()이라고 하시면 안됩니다.
CClass는 클래스 이름이지 객체가 아니기 때문입니다.
따라서
let myCClass = CClass()
myCClass.printString()
이렇게 CClass타입의 객체를 생성한 뒤 객체를 통해 메소드를 호출하셔야 합니다.
그렇군요 감사합니다!
일단 에러는 안나는 데
let stringURL = NSURL(string: url)
let requestObj = NSURLRequest(URL: stringURL!)
WebViewTest.loadRequest(requestObj)
를 빌드하면 Thread 1 : EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 에러가 납니다.
fatal error: unexpectedly found nil while unwrapping and Optional value 라고 나오네요....
T^T 뭐가 문제인지...
전체코드 첨부가능하실까요?
webViewclass.swift파일 내 코드는 아래와 같습니다.
import UIKit
class webViewclass: UIViewController {
@IBOutlet weak var webviewTest: UIWebView!
func goToUrl(url:String){
let stringURL = NSURL(string: url)
let requestObj = NSURLRequest(URL: stringURL!)
WebViewTest.loadRequest(requestObj)
}
}
이니셜뷰컨트롤러는 아래 코드만 추가했습니다webViewclass().goToUrl("http://www.naver.com")
webViewClass().goToUrl("----")
이 아니라
let wvClass = webViewClass()
wvClass.goToUrl("----")
로 해보시겠어요?
그리고 교재하나 구매하셔서 스위프트와 객체지향에 대해서 동시에 공부하시면 도움이 될 것 같습니다~
말씀해주신 대로 해보았는데도 빌드 성공 메시지 나온 후 시뮬레이터에서 앱이 실행되면서 Thread 1 : EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) 에러가 나서요..ㅠㅜ