Swift yapısını Objective-C'de kullanma


97

Basitçe, uygulama sabitlerini aşağıdaki gibi depolayan bir yapım var:

struct Constant {

    static let ParseApplicationId = "xxx"
    static let ParseClientKey = "xxx"

    static var AppGreenColor: UIColor {
        return UIColor(hexString: "67B632")
    }
}

Bu sabitler, Constant.ParseClientKeyörneğin arayarak Swift kodunda kullanılabilir . Ama benim kodumda bazı Objective-C sınıfları da var. Öyleyse sorum, bu sabitleri Objective-C kodunda nasıl kullanacağım?

Sabitleri bu şekilde bildirmenin yolu iyi değilse, o zaman hem Swift hem de Objective-C kodunda kullanılacak global sabitler oluşturmanın en iyi yolu nedir?


22
Lütfen genel hızlı kod stilini izleyin ve let / var tanımlayıcılarınızı başlatmak için küçük harf kullanın.
Nikolai Ruhe

4
@NikolaiRuhe Bu, bir yapının statik özellikleri için doğru stil olmaz mıydı? Çok gibi UIControlEvents.TouchUpInside?
Luke Rogers

1
@NikolaiRuhe Swift beyanına bir göz atın: developer.apple.com/library/ios/documentation/UIKit/Reference/… - kesinlikle bir yapı.
Luke Rogers

1
@LukeRogers Bunun nedeni, Swift 2.0'ın NS_OPTIONSstil numaralandırmalarının nasıl içe aktarılacağının değişmiş olmasıdır . Anlamsal UIControlEventolarak hala bir numaralandırma türüdür.
Nikolai Ruhe

5
@NikolaiRuhe LukeRogers: Dinh bu konuyu sormadı ve çoğumuz bunu okumak için buraya tıklamadık.
original_username

Yanıtlar:


114

Söylemesi üzücü struct, ne de global değişkenleri Objective-C'ye maruz bırakamazsınız . belgelere bakın .

Şu an itibariyle, IMHO, en iyi yol şuna benzer:

let ParseApplicationId = "xxx"
let ParseClientKey = "xxx"
let AppGreenColor = UIColor(red: 0.2, green: 0.7, blue: 0.3 alpha: 1.0)

@objc class Constant: NSObject {
    private init() {}

    class func parseApplicationId() -> String { return ParseApplicationId }
    class func parseClientKey() -> String { return ParseClientKey }
    class func appGreenColor() -> UIColor { return AppGreenColor }
}

Objective-C'de bunları şu şekilde kullanabilirsiniz:

NSString *appklicationId = [Constant parseApplicationId];
NSString *clientKey = [Constant parseClientKey];
UIColor *greenColor = [Constant appGreenColor];

Swift için de erişilebilir mi?
khunshan

@khunshan Evet. Doğrudan ParseClientKeyveya sınıf üzerinden erişilebilirConstant.clientKey()
Fabian

7
Kullanmalı mıyım@objc class Constant: NSObject
William Hu

1
Bu işe yarıyor ama Swift 4'te onları Objective C kodundan arayabilmek için @objcherkesin önüne koymam gerekiyordu class func.
ElectroBuddha

2
@ElectroBuddha @objcMembersTüm sınıfı Objective-C koduna göstermek için sınıfta yapabilirsiniz .
user1898712

19

Neden hem a hem de structan ile bir dosya oluşturmuyorsunuz, bunun @objc classgibi bir şey:

import UIKit

extension UIColor {
    convenience init(hex: Int) {
        let components = (
            R: CGFloat((hex >> 16) & 0xff) / 255,
            G: CGFloat((hex >> 08) & 0xff) / 255,
            B: CGFloat((hex >> 00) & 0xff) / 255
        )
        self.init(red: components.R, green: components.G, blue: components.B, alpha: 1)
    }
}

extension CGColor {
    class func colorWithHex(hex: Int) -> CGColorRef {
        return UIColor(hex: hex).CGColor
    }
}

struct Constant {
    static let kParseApplicationId = "5678"
    static let kParseClientKey = "1234"
    static var kAppGreenColor: UIColor { return UIColor(hex:0x67B632) }
    static var kTextBlackColor: UIColor { return UIColor(hex:0x000000) }
    static var kSomeBgBlueColor: UIColor { return UIColor(hex:0x0000FF) }
    static var kLineGrayCGColor: CGColor { return CGColor.colorWithHex(0xCCCCCC) }
    static var kLineRedCGColor: CGColor { return CGColor.colorWithHex(0xFF0000) }
}


@objc class Constants: NSObject {
    private override init() {}

    class func parseApplicationId() -> String { return Constant.kParseApplicationId }
    class func parseClientKey() -> String { return Constant.kParseClientKey }
    class func appGreenColor() -> UIColor { return Constant.kAppGreenColor }
    class func textBlackColor() -> UIColor { return Constant.kTextBlackColor }
    class func someBgBlueColor() -> UIColor { return Constant.kSomeBgBlueColor }
    class func lineGrayCGColor() -> CGColor { return Constant.kLineGrayCGColor }
    class func lineRedCGColor() -> CGColor { return Constant.kLineRedCGColor }
}

Objective-C dosyalarında kullanmak için, sabitleri kullanmanız gerektiğinde bunu ekleyin:

#import "ProjectModuleName-Swift.h"

Hızlı kullanım:

self.view.backgroundColor = Constant.kAppGreenColor

Objective-C kullanımı:

self.view.backgroundColor = [Constants appGreenColor];

Bu şekilde, tüm uygulama için renkleri, varsayılan metni, web hizmeti URL'lerini tek bir yerde güncelleyebilirsiniz.


1
Hedef-c bölümünü keşfetmek için cevabınızı kaydırabileceğimiz hemen anlaşılmadı!
Cœur

1

Bu sabitlere yalnızca sınıf aracılığıyla erişmek için kodunuzda diğer Swift türlerini yapmak istiyorsanız, let ifadelerini özel yapmalısınız:

private let AppGreenColor = UIColor(red: 0.2, green: 0.7, blue: 0.3 alpha: 1.0)

@objc class Constant {
    class func appGreenColor() -> UIColor { return AppGreenColor }
}

Swift'de bunları şu şekilde kullanabilirsiniz:

UIColor *greenColor = Constant.appGreenColor

Let ifadesi özel olduğundan, aşağıdaki satır artık derlenmeyecektir:

UIColor *greenColor = appGreenColor

1

Bu geç veya gereksiz olabilir, ancak aşağıdaki kodla çalışmasını sağlayabilirim:

@objcMembers class Flags: NSObject {
    static let abcEnabled = false
    static let pqrEnabled = false
    .
    .
    .
}

Açıktır ki, objc c kodunda kullanmak için #import "ProjectModuleName-Swift.h" yapmanız gerekir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.