আপনি কিভাবে সুইফটে কমান্ড লাইন আর্গুমেন্ট অ্যাক্সেস করবেন?


121

আপনি সুইফটে একটি কমান্ড লাইন অ্যাপ্লিকেশনটির জন্য কমান্ড লাইন যুক্তিগুলি কীভাবে অ্যাক্সেস করবেন?


উত্তর:


7

অ্যাপল কেবল এটি করার ArgumentParserজন্য লাইব্রেরি প্রকাশ করেছে :

আমরা ঘোষণা করতে পেরে আনন্দিত ArgumentParser, একটি নতুন ওপেন-সোর্স লাইব্রেরি যা এটিকে সোজা - এমনকি উপভোগ্য করে তোলে! - সুইফটে কমান্ড-লাইন যুক্তি পার্স করতে।

https://swift.org/blog/argument-parser/


সুইফ্ট আর্গুমেন্ট পার্সার

https://github.com/apple/swift-argument-parser

কমান্ড লাইন থেকে আপনার সংগ্রহ করা প্রয়োজনীয় তথ্য সংজ্ঞায়িত করে এমন একটি প্রকার ঘোষণা করে শুরু করুন। প্রতিটি সঞ্চিত সম্পত্তিকে ArgumentParserযেকোন একটির সম্পত্তি মোড়ক দিয়ে সাজান, এবং এর সাথে সম্মতি ঘোষণা করুন ParsableCommand

ArgumentParserগ্রন্থাগার কমান্ড লাইন আর্গুমেন্ট পারেন parses, আপনার আদেশ টাইপ instantiates, এবং তারপর আপনার কাস্টম executes run()দরকারী একটি বার্তা পদ্ধতি বা প্রস্থানের।


305

আপডেট 01/17/17: আপডেট হয়েছে সুইফট 3 Processএর উদাহরণটি নতুন নামকরণ করা হয়েছে CommandLine


আপডেট 09/30/2015: সুইফট 2 এ কাজ করার উদাহরণ আপডেট করেছে।


এটা আসলে ফাউন্ডেশন ছাড়া এই কাজ করতে সম্ভব বা C_ARGV এবং C_ARGC

সুইফ্ট স্ট্যান্ডার্ড লাইব্রেরিতে এমন একটি স্ট্রাক্ট রয়েছে CommandLineযার মধ্যে Stringডাকা সংকলন রয়েছে arguments। সুতরাং আপনি এই জাতীয় যুক্তিগুলি স্যুইচ করতে পারেন:

for argument in CommandLine.arguments {
    switch argument {
    case "arg1":
        print("first argument")

    case "arg2":
        print("second argument")

    default:
        print("an argument")
    }
}

10
অ্যালবিনস্টিগো প্রসেস.আরগারমেন্টস ইতিমধ্যে স্ট্রিংগুলির একটি অ্যারে, একটি নতুন তৈরি করার দরকার নেই।
ল্যান্স

9
প্রায় সর্বদা সর্বোত্তম উত্তর গৃহীত উত্তর নয়। :)
হেপাকেস

5
আমার ছাড়া যদি কেউ যত্ন করে তবে প্রক্রিয়াটি আসলে একটি গণনা
রোবব্রব্রো

1
কি Process.argumentsহিসাবে একই NSProcessInfo.processInfo().arguments?
ফ্রাঙ্কলিন ইউ

5
অতি সাম্প্রতিক সুইফট স্ন্যাপশটগুলিতে (হয় 7/28 স্ন্যাপশট বা 7/29 স্ন্যাপশট), Processঅবজেক্টটি এখন CommandLineঅবজেক্ট হিসাবে পরিচিত । সুইফট ৩.০ আনুষ্ঠানিকভাবে প্রকাশিত হলে এটি সম্ভবত সম্পূর্ণরূপে সংহত হবে।
TheSoundDefense


46

শীর্ষ স্তরের স্থির C_ARGCএবং ব্যবহার করুন C_ARGV

for i in 1..C_ARGC {
    let index = Int(i);

    let arg = String.fromCString(C_ARGV[index])
    switch arg {
    case "this":
        println("this yo");

    case "that":
        println("that yo")

    default:
        println("dunno bro")
    }
}

নোট করুন যে আমি ব্যাপ্তিটি ব্যবহার করছি 1..C_ARGCকারণ এর প্রথম উপাদানটিC_ARGV "অ্যারে" এর হ'ল অ্যাপ্লিকেশনটির পথ।

C_ARGVপরিবর্তনশীল আসলে একটি অ্যারের নয় কিন্তু উপ-স্ক্রিপ্টেবল একটি অ্যারের ভালো হয়।


4
আপনি যেমন এনজিপ্রোসেসইনফো ব্যবহার করতে পারেন ঠিক তেমনই আপনি উদ্দেশ্য-সি-তে করেন।
জ্যাক লরেন্স

3
এনএসপ্রোসেসইনফো ফাউন্ডেশন প্রয়োজন। আমার উত্তর ফাউন্ডেশন প্রয়োজন হয় না। কেবল সুইফ্ট ল্যাং স্ট্যান্ডার্ড লিব ব্যবহার করে।
orj

7
C_ARCGআর সমর্থিত বলে মনে হচ্ছে না।
juandesant

2
আমি নিশ্চিত করতে পারি যে সি_আরজি আর সরঞ্জামগুলির সর্বশেষতম সংস্করণ, এক্সকোড সংস্করণ 7.1 (7B91 বি) এর সাথে আর কাজ করে না।
এসভিথ

8
পরিবর্তে আপনি ব্যবহার করতে পারেন Process.argcএবং Process.argumentsএই জন্য, যদিও এটা ভালো দেখায় পরিবর্তন করা যেতে পারে CommandLine.argcএবং CommandLine.argumentsভাষা থেকে সাম্প্রতিকতম পরিবর্তনের সঙ্গে।
TheSoundDefense

14

যে কেউ পুরানো "getopt" (যা সুইফটে পাওয়া যায়) ব্যবহার করতে চায় এটি এটিকে রেফারেন্স হিসাবে ব্যবহার করতে পারে। আমি সিটিতে জিএনইউ উদাহরণের একটি সুইফট বন্দর তৈরি করতে পারি যার মধ্যে এটি পাওয়া যাবে:

http://www.gnu.org/software/libc/manual/html_node/Example-of-Getopt.html

একটি সম্পূর্ণ বিবরণ সহ। এটি পরীক্ষিত এবং সম্পূর্ণরূপে কার্যক্ষম। এটি ফাউন্ডেশন প্রয়োজন হয় না।

var aFlag   = 0
var bFlag   = 0
var cValue  = String()

let pattern = "abc:"
var buffer = Array(pattern.utf8).map { Int8($0) }

while  true {
    let option = Int(getopt(C_ARGC, C_ARGV, buffer))
    if option == -1 {
        break
    }
    switch "\(UnicodeScalar(option))"
    {
    case "a":
        aFlag = 1
        println("Option -a")
    case "b":
        bFlag = 1
        println("Option -b")
    case "c":
        cValue = String.fromCString(optarg)!
        println("Option -c \(cValue)")
    case "?":
        let charOption = "\(UnicodeScalar(Int(optopt)))"
        if charOption == "c" {
            println("Option '\(charOption)' requires an argument.")
        } else {
            println("Unknown option '\(charOption)'.")
        }
        exit(1)
    default:
        abort()
    }
}
println("aflag ='\(aFlag)', bflag = '\(bFlag)' cvalue = '\(cValue)'")

for index in optind..<C_ARGC {
    println("Non-option argument '\(String.fromCString(C_ARGV[Int(index)])!)'")
}

0

আপনি CommandLine.argumentsঅ্যারে ব্যবহার করে একটি যুক্তি পার্সার তৈরি করতে এবং আপনার পছন্দ মতো কোনও যুক্তি যুক্ত করতে পারেন।

আপনি এটি পরীক্ষা করতে পারেন। একটি ফাইল তৈরি করুনarguments.swift

//Remember the first argument is the name of the executable
print("you passed \(CommandLine.arguments.count - 1) argument(s)")
print("And they are")
for argument in CommandLine.arguments {
    print(argument)
}

এটি সঙ্কলন এবং এটি চালান:

$ swiftc arguments.swift
$ ./arguments argument1 argument2 argument3

আপনার নিজের আর্গুমেন্ট পার্সার তৈরির বিষয়টি আপনার কমান্ড-লাইন আর্গুমেন্ট কনভেনশনগুলিকে বিবেচনা করছে। আমি একটি বিদ্যমান আর্গুমেন্ট পার্সার ব্যবহার করার পরামর্শ দেব।

আপনি ব্যবহার করতে পারেন:

  • বাষ্পের কনসোল মডিউল
  • টিএসসি ইউটিলিটি আর্গুমেন্ট পার্সার সুইফট প্যাকেজ ম্যানেজার দ্বারা ব্যবহৃত
  • অ্যাপল দ্বারা খোলা স্যুইফ্ট আর্গুমেন্ট পার্সার

আমি তিনটিতে কমান্ড-লাইন সরঞ্জাম কীভাবে তৈরি করবেন সে সম্পর্কে লিখেছি। আপনার এটি পরীক্ষা করে নেওয়া উচিত এবং কোন স্টাইলটি আপনার পক্ষে সবচেয়ে উপযুক্ত।

আপনি যদি আগ্রহী হন তবে এখানে লিঙ্কগুলি রয়েছে:

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.