Swift mix가 Objective-C 프로젝트에 빠졌습니다(수시로 업데이트)

5535 단어 Swift
최근 Objective-C에 적힌 항목에 Swift(1.2)를 넣었다.
많은 지식을 쌓았기 때문에 나누고 싶어요.
Swift 및 Objective-C 호환성에 대해서는 다음 정보가 있습니다.
  • Using Swift with Cocoa and Objective-C
  • Swift and Objective-C Interoperability
  • Objc에서h에서 설명한 상수를 볼 수 없습니다


    아래와 같이, 눈썹에 설명하더라도 구축된 링크에서 복사할 수 있습니다.
    // Foo.h
    static NSString * kSomeConstant = @"hello";
    @interface Foo : NSObject
    @end
    
    아래와 같다.
    // Foo.h
    extern NSString * const kSomeConstant
    @interface Foo : NSObject
    @end
    
    // Foo.m
    NSString * const kSomeConstant = @"hello";
    @implementation Foo : NSObject
    @end
    

    Objc 측의 define 매크로가 보이지 않습니다.


    글쎄, 그런 거지.

    objc에서 Command+Click을 통해 선언부로 이동한 후 {Product]-Swift.h까지 날아가서 설치가 안 보여요.


    이것은 원래의 것이다.스위프트까지 날아가도 되잖아!그렇게 생각해.

    #if DEBUG가 작동하지 않음

    #if DEBUG
        NSLog(s)
    #endif 
    
    이런 느낌의 코드를 이식했어요.
    #if DEBUG
        println(s)
    #endif 
    
    로그가 출력되지 않았습니다.
    가만 생각해보면 오더 스위프트 플래그에 아무것도 안 넣었을 뿐이야.

    내연 define 함수 정의는 이식할 수 없습니다


    여러분들도 로고에서 이런 걸 사용해 보셨을 거라고 생각해요.
    #ifdef DEBUG
    #define DEBUGLOG(...) NSLog(__VA_ARGS__)
    #else
    #define DEBUGLOG(...)
    #endif
    
    스위프트에선 이걸 전혀 볼 수 없어.
    그러나 println 같은 것은 내연 정의에서 사용된다.
    swift1.2
    @inline(never) func println<T>(value: T)
    
    이 정의를 모방하면 바로 바꿀 수 있습니까?그렇게 생각해서 해봤어요.
    @inline(never) func DEBUGLOG(s:String) {
        #if DEBUG
            println(s)
        #endif
    }
    
    Swift 측에서는 이렇게 하면 좋겠지만 Objective-C에서 사용할 때 C99 오류가 발생했습니다.

    잘 모르겠지만 내부에서 같은 걸 먼저 만드는 걸 포기하고 그런 느낌으로 대응했다.
    struct Logger {
        static func debug(s:String) {
            // このDEBUGはマクロではなく、Other Swift Flagの設定値であることに注意!
            #if DEBUG
                println(s)
            #endif
        }
        static func info(s:String) {
            println(s)
        }
    }
    
    로거와 관련해서는 다양한 오픈소스 라이브러리가 등장해 도입도 검토할 수 있다.
    이 근처는 스위프트로 썼어요.
  • https://github.com/DaveWoodCom/XCGLogger
  • https://github.com/hubertr/Swell
  • https://github.com/matteocrippa/awesome-swift#logging
  • 아무래도 宏을 사용할 수 없기 때문에 info, debug, error, warning 등을 분리하려면plist 등으로 설정해야 한다.
    그나저나 NSLog보다 println이 더 빠릅니다.
  • Swift: print() vs println() vs NSLog()
  • Swift println 은 NSLog 의 10 배 정도 빠른 속도
  • 메소드 체인


    Objective-C는 nil에 대해 비교적 관용적인 규격으로 예를 들어 방법체인의 중도에 의견 피드백이 있는 경우 if let에서 토론을 전개해야 한다.
    예를 들면, 바로 이런 느낌이다.
    if let url = NSBundle.mainBundle().appStoreReceiptURL?.path {}
    
    이상은!

    좋은 웹페이지 즐겨찾기