스위프트 네이티브 베이스 클래스 또는 NSObject
저는 스위프트를 통해 몇 가지 스윕을 테스트해 보았고 NSObject가 슈퍼클래스일 때(직접 또는 더 위) 또는 '@objc' 장식을 사용할 때만 작동한다는 것을 발견했습니다.그렇지 않으면 C++와 같이 정적 및 vtable-dispatch 스타일을 따릅니다.
Cocoa/NSObject 기본 클래스가 없는 Swift 클래스를 정의하는 것이 정상입니까?만일 걱정된다면, 이는 방법 가로채기와 런타임 내성과 같은 목표-C의 역동성의 많은 부분을 언급한 것을 의미합니다.
동적 런타임 동작은 속성 관찰자, 핵심 데이터, Aspect Oriented Programming, Higher Order Messaging, 분석 및 로깅 프레임워크 등과 같은 기능의 핵심에 위치합니다.
Objective-C의 메소드 호출 스타일을 사용하면 메소드 호출에 약 20개의 머신 코드 피연산자가 추가되므로 특정 상황에서는 C++ 스타일의 정적 및 vtable 디스패치가 더 나은 성능을 발휘할 수 있습니다.
하지만 일반적인 95-5 규칙(성능 향상의 95%는 코드의 5%를 튜닝하는 것에서 발생)을 고려할 때 강력한 동적 기능부터 시작하여 필요한 경우 강화하는 것이 타당하지 않습니까?
NSObject의 하위 클래스인 Swift 클래스:
- 목표-C 클래스 자체입니다.
- 사용하다
objc_msgSend()그들의 방법에 대한 (대부분의) 요구 - 대부분의 방법 구현을 위한 Objective-C 런타임 메타데이터 제공
NSObject의 하위 클래스가 아닌 Swift 클래스:
- Objective-C 클래스이지만 NSObject 호환성을 위해 몇 가지 메서드만 구현합니다.
- 을 쓰지
objc_msgSend()메서드에 대한 호출(기본값) - 메서드 구현에 대한 Objective-C 런타임 메타데이터 제공 안 함(기본값)
Swift에서 NSObject를 서브클래싱하면 Objective-C 런타임 유연성뿐만 아니라 Objective-C 성능도 얻을 수 있습니다.Objective-C의 유연성이 필요 없는 경우 NSObject를 피하는 것이 성능을 향상시킬 수 있습니다.
편집:
Xcode 6 베타 6에서는 동적 속성이 나타납니다.이를 통해 스위프트에게 동적 디스패치를 사용하도록 지시할 수 있으며, 따라서 인터셉션을 지원합니다.
public dynamic func foobar() -> AnyObject {
}
또한 NSObject에 Swift 클래스를 기반으로 하는 경우 코딩 버그를 숨길 수 있는 예기치 않은 런타임 동작을 볼 수 있다는 것을 발견했습니다.여기 예가 있습니다.
이 예제에서 NSObject를 기반으로 하지 않는 경우 컴파일러는 테스트에서 오류를 정확하게 발견합니다.잘못된_CompilerShouldSpot, 보고 "...'MyClass'를 'MirrorDisposition'으로 변환할 수 없습니다."
class MyClass {
let mString = "Test"
func getAsString() -> String {
return mString
}
func testIncorrect_CompilerShouldSpot() {
var myString = "Compare to me"
var myObject = MyClass()
if (myObject == myString) {
// Do something
}
}
func testCorrect_CorrectlyWritten() {
var myString = "Compare to me"
var myObject = MyClass()
if (myObject.getAsString() == myString) {
// Do something
}
}
}
이 예제에서는 NSObject를 기준으로 컴파일러가 테스트에서 오류를 발견하지 못합니다.부정확한_Compiler Should Spot:
class myClass : NSObject {
let mString = "Test"
func getAsString() -> String {
return mString
}
func testIncorrect_CompilerShouldSpot() {
var myString = "Compare to me"
var myObject = MyClass()
if (myObject == myString) {
// Do something
}
}
func testCorrect_CorrectlyWritten() {
var myString = "Compare to me"
var myObject = MyClass()
if (myObject.getAsString() == myString) {
// Do something
}
}
}
제 생각에 도덕성은 정말로 필요한 NSObject에만 바탕을 둔 것 같습니다!
언어 참조에 따르면 클래스가 표준 루트 클래스를 서브클래스할 필요가 없으므로 필요에 따라 슈퍼클래스를 포함하거나 생략할 수 있습니다.
클래스 선언에서 수퍼클래스를 생략해도 어떤 종류의 암시적인 기본 수퍼클래스가 할당되지는 않습니다.독립 클래스 계층 구조의 루트가 되는 기본 클래스를 정의합니다.
언어 참조에서:
스위프트 클래스는 범용 기본 클래스에서 상속되지 않습니다.수퍼클래스를 지정하지 않고 정의하는 클래스는 자동으로 기본 클래스가 됩니다.
하려고 을 참조하려고 하는 중super클래스가 클래스 시간 오류가 합니다.퍼스즉본스서다가간일는다서가스)m본간즉t일(na퍼r스a가atsir .
'super' members cannot be referenced in a root class
다음은 Apple의 Swift-eBook에서 복사한 것으로 질문에 대한 적절한 답변을 제공합니다.
기본 클래스 정의
다른 클래스에서 상속되지 않는 클래스를 기본 클래스라고 합니다.
스위프트 클래스는 범용 기본 클래스에서 상속되지 않습니다.수퍼클래스를 지정하지 않고 정의하는 클래스는 자동으로 기본 클래스가 됩니다.
언급
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Inheritance.html #//apple_ref/doc/uid/TP40014097-CH17-XID_251은 ㅇㅇㅇ가 아닐 것이라고 합니다.objc Objective C 됩니다. T Objective C 인프라스트럭처와 통신해야 하는 부분만 명시적으로 표시됩니다.
런타임 인트로스펙션이 언어에 어느 정도까지 추가될지는 알 수 없습니다.메소드 가로채기는 메소드가 명시적으로 허용하는 경우에만 가능합니다.이것은 제 추측이지만, 애플 내의 언어 디자이너들만이 그들이 진정으로 어디로 향하고 있는지를 잘 알고 있습니다.
정상입니다.Swift의 설계 목표를 살펴봅니다.목표는 거대한 수준의 프로그래밍 문제를 사라지게 하는 것입니다.Method Swizzling은 Swift와 함께 하고 싶은 것 중 하나가 아닐 것입니다.
언급URL : https://stackoverflow.com/questions/24057525/swift-native-base-class-or-nsobject
'programing' 카테고리의 다른 글
| jquery($query)($query)($query.on), selector, ...) vs $(query.on), (0) | 2023.09.17 |
|---|---|
| 테이블 필드에 하이픈이 포함될 수 있습니까? (0) | 2023.09.17 |
| 2PL, 엄격 모델 대 엄격 모델, 혜택이 있습니까? (0) | 2023.09.17 |
| 자식 테마를 사용하기 위해 부모 테마의 폴더를 포함할 수 있습니까? (0) | 2023.09.17 |
| 브라우저가 400px 이하로 확장되지 않습니까? (0) | 2023.09.17 |