मैं अपने नुस्खा प्रबंधक ऐप में घटक स्केलिंग सुविधा की पेशकश करने की कोशिश कर रहा हूं। स्केल किया गया परिणाम केवल प्रदर्शन उद्देश्य के लिए है और इसे जारी नहीं रखा जाएगा।

मान लें कि हमारे पास एक फ्राइड राइस रेसिपी है और इसकी सामग्री में 2 bowls of rice, 1 egg, 1 tbsp soy sauce है और यह 2 सर्विंग (व्यक्तियों) के लिए है।

इस संख्या '2' के बीच में - और + बटन हैं जो वृद्धि/कमी की सेवा के लिए दिखाई देंगे - 2 +

जब भी - और + आइकनों को दबाया जाता है, तो यह एक घटक स्ट्रिंग से संख्या प्राप्त करने के लिए एक फ़ंक्शन चलाएगा और 1 सर्विंग की सामग्री मात्रा प्राप्त करेगा। पकाने की विधि डेटा किसी भी सेवारत आकार में सहेजा जा सकता है, इसलिए स्केलिंग के लिए मुझे हमेशा 1 सेवारत भाग से शुरू करने की आवश्यकता होती है। मेरे उदाहरण के आधार पर, 1 सर्विंग सामग्री की मात्रा 1 bowls of rice, 0.5 egg, 0.5 tbsp soy sauce होनी चाहिए, इस प्रकार [1, 0.5, 0.5]

तब मैं उपयोगकर्ता कार्रवाई के आधार पर घटक मात्रा को माप सकता हूं। अब तक मैंने निम्नलिखित का पता लगाया है जो पूरे घटक स्ट्रिंग से संख्या स्ट्रिंग प्राप्त करता है, इसे एक सरणी में बनाता है और इसे इंट सरणी में परिवर्तित करता है।

if recipe.ingredients != "" {
    let ingredientStr = recipe.ingredients
    let numStr = ingredientStr?.componentsSeparatedByCharactersInSet(
                    NSCharacterSet
                        .decimalDigitCharacterSet()
                        .invertedSet)
    let array = numStr!.filter({ $0 != "" })
    var intArray = array.map{ Int($0)! }
}

मैंने यहाँ से संख्याओं की गणना करने के लिए विभिन्न तरीकों की कोशिश की है, लेकिन अपेक्षित संख्याएँ प्राप्त करने में असफल रहा। मैंने जो पूरा नहीं किया है वह है:

  • 1 सर्विंग मात्रा प्राप्त करें
  • +, - क्रिया . के आधार पर पैमाने की मात्रा
  • प्रदर्शित करने के लिए अंकगणितीय परिणाम को मूल स्ट्रिंग में वापस डालें
2
Seong Lee 19 मई 2016, 10:02

2 जवाब

सबसे बढ़िया उत्तर

क्या आपको यही चाहिए?

extension Float {
    var cleanValue: String {
        return self % 1 == 0 ? String(format: "%.0f", self) : String(self)
    }
}

let item = "1 bowls of rice, 0.5 egg, 0.5 tbsp soy sauce"

func computeServing(inputString: String, servingCount:Int) -> String {
    var components = item.componentsSeparatedByString(" ")

    for idx in 0..<components.count {
        if let integer = Int(components[idx]){
            components[idx] = String(integer * servingCount)
        } else if let float = Float(components[idx]){
            components[idx] = String((float * Float(servingCount)).cleanValue)
        }
    }

    return components.joinWithSeparator(" ")

}

computeServing(item, servingCount: 3)
2
Tony Nguyen 19 मई 2016, 10:27

निम्नलिखित स्ट्रिंग से घटक जानकारी निकालता है। उसके आधार पर आप डेटा में हेरफेर कर सकते हैं और बस फिर से घटकों में शामिल हो सकते हैं। (आपके लिए एक छोटी सी चुनौती बनी हुई है;))

func extractInfo(text: String!) -> [(String, Double)] {

    let regex = try! NSRegularExpression(pattern: "(([0-9.]+)([^0-9]+))", options: [])
    let nsString = text as NSString
    let results = regex.matchesInString(text, options: [], range: NSMakeRange(0, nsString.length))

    return results.map {
        (nsString.substringWithRange($0.rangeAtIndex(3)), Double(nsString.substringWithRange($0.rangeAtIndex(2)))!)
    }
}

let input = "12 bowls of rice, 1 egg, 0.5 tbsp soy sauce"
extractInfo(input)

यह दिए गए इनपुट के लिए आउटपुट करता है:

[(" चावल के कटोरे, ", 12), ("अंडा, ", 1), (" बड़ा चम्मच सोया सॉस", 0.5)]

कृपया ध्यान दें कि दिए गए कोड में कोई त्रुटि प्रबंधन नहीं है। यह वैकल्पिक पार्स किए गए डबल को बलपूर्वक खोल देता है और उम्मीद करता है कि प्रत्येक रेगेक्स मैच में 4 समूह होंगे - प्रोग्राम क्रैश से बचने के लिए वास्तव में टीआई करने से पहले जांच की जानी चाहिए।

1
luk2302 19 मई 2016, 10:31