সুইফটে গল্ফ করার টিপস


24

সুইফটে কোড-গল্ফ করার জন্য কিছু টিপস কি? সুরক্ষার দিকে এর ফোকাসটি গল্ফ করা কঠিন বলে মনে হচ্ছে, তবে এটি সামান্য টিপস এবং আরও কার্যকর করে তোলে। সুইফটে এমন কোনও বৈশিষ্ট্য রয়েছে যা এটি নির্দিষ্ট অ্যাপ্লিকেশনগুলিতে কোড-গল্ফের ক্ষেত্রে দক্ষ হতে পারে?

দয়া করে উত্তর প্রতি একটি টিপ পোস্ট করুন।


11
আপনি আমাদের উপর নির্ভর করতে পারেন - যদি এটি নিরাপদ বোঝানো হয় তবে এটি তৈরি করা হবে দানানগিজিআররিওইউসিস গল্ফ!
কনর ও'ব্রায়েন

9
আশা করি দ্রুত কিছু ভাল টিপস আসবে।
DJMcMayhem

4
সুইফ্ট গল্ফিং? আমি ভেবেছিলাম যে গল্ফটি একটি ধীর
গতিযুক্ত

উত্তর:


6

রেঞ্জ

সত্যিই সহায়ক একটি জিনিস ...বা ..<অপারেটরগুলি ব্যবহার করে ব্যাপ্তি তৈরি করা

উদাহরণ স্বরূপ

array[0..<n] //first n elements of array
array[k..<n] //kth through nth elements of array
array[k...n] //kth through n-1 elements of array

সুতরাং, একটি অ্যারের 4 র্থ মানের মাধ্যমে 2 য় পেতে

let myArray = ["ab", "cd", "ef", "gh", "ij", "kl", "mn", "op"]
print(myArray[1..<4]) //["cd", "ef", "gh"]

বাস্তবিক ব্যবহার

let a = [3, 1, 4, 1, 5, 9]

ব্যবহার

for v in a[0...3]{print(v)}

এর চেয়ে কম 8 বাইট

for n in 0...3{let v=a[n];print(v)}

4
for n in 0...3{print(a[n])}বৈধ নয়?
জুলিয়ান ওল্ফ

4

বন্ধ:

ভেরিয়েবলগুলির হোল্ড একটি ফাংশন হোল্ড বনাম কোনও ফাংশন ব্যবহার করে নিজেই সহায়তা করতে পারে:

65 বাইট:

var r:(String,Int)->String={return String(repeating:$0,count:$1)}

66 বাইট:

func r(s:String,i:Int)->String{return String(repeating:s,count:i)}

এখানে ছোট পার্থক্য, তবে এটি কিছু ধাঁধাতে আরও প্রদর্শন করবে।

সংক্ষিপ্তকরণ কার্যাদি:

পূর্ববর্তী উদাহরণের দিকে তাকানো আমার কিছু মনে করিয়ে দেয়। কখনও কখনও, আপনি যদি যথেষ্ট সময় কোনও ফাংশন ব্যবহার করেন তবে এটির নামকরণের জন্য এটি স্থানের পক্ষে মূল্যবান:

এই:

String(repeating:$0,count:$1)

এটি:

var r:(String,Int)->String={return String(repeating:$0,count:$1)}

বা, আসলে, এটি আরও ভাল:

var r=String.init(repeating:count:)

আপনি কেবল r("Hello World",8)পরিবর্তে কল করুনString(repeating:"Hello World",count:8)

প্রকারের ঘোষণাগুলি রেখে যাওয়া:

আমি একবার আর্গুমেন্টের ধরণটি সেট না করেই একটি ক্লোজার তৈরি করেছিলাম, এভাবে একটি ছোট উত্তর তৈরি করুন:

var f={(i)->Int in i-1+i%2*2}

সংকলকটি অনুমান iকরা হয়Int

দ্রুত পদ্ধতিতে অ্যারেগুলি তৈরি করুন:

আপনার যদি অ্যারের প্রয়োজন হয় তবে এটি তৈরি Intsকরতে একটি ব্যবহার করুন Range:

Array(0...5)

এটি একই জিনিস করে:

[0,1,2,3,4,5]

এর পরিবর্তে Ifবা অ্যারে Switch:

এটি করার পরিবর্তে:

if n==0{return "a"}else if n==1{return "b"}else{return "c"}

আপনি সম্ভবত এটি করতে পারেন:

return ["a","b","c"][n]

সংক্ষিপ্ত প্রকারগুলি:

আপনি যদি ধরণের রূপান্তরটি প্রচুর ব্যবহার করে থাকেন তবে আপনি একটি টাইপ উপন্যাস তৈরি করতে চাইতে পারেন:

typealias f=Float

মানচিত্র:

মনে রাখবেন যে আপনার প্রায়শই ফাংশনে returnকীওয়ার্ডটি ব্যবহার করার প্রয়োজন হয় না map

চলমান সুইফট অনলাইন:

অনলাইনে চেষ্টা করুন যদিও এখন এটি সুইফটকে সমর্থন করে না !


2
পোস্টের জন্য ধন্যবাদ. আমাকে অনেক সাহায্য করেছে। tio.run/nexus এখন swift :) এর সাথে কাজ করে :)
পামমে

3

try

সুইফট ২.x এবং এর উপরে, ফাংশনগুলি যা NSErrorফাংশন প্যারামিটার হিসাবে কোনও বস্তুর কাছে পয়েন্টারটি পাস করার মাধ্যমে traditionতিহ্যগতভাবে ত্রুটিগুলি পরিচালনা করে throwtheir

এর অর্থ এই:

var regex = NSRegularExpression(pattern: "\"((http)s?://.*?)\"", options: nil, error: nil)

এখন দেখে মনে হচ্ছে:

do {
    let regex = try NSRegularExpression(pattern: "\"((http)s?://.*?)\"", options: [])
} catch {
    print(error)
}

এটি ব্যবহার করে try?বা সংক্ষিপ্ত করা যেতে পারে try!। কোনও ত্রুটি নিক্ষিপ্ত হলে try?অভিব্যক্তিটিকে মূল্যায়ন করবে niltry!যদি কোনও ত্রুটি নিক্ষেপ করা হয় তবে আপনার প্রোগ্রামটি ক্র্যাশ করবে এবং কেবল এমন ক্ষেত্রে ব্যবহার করা উচিত যেখানে কোনও ত্রুটি কখনও ছুঁড়ে ফেলা হবে না।

let regex = try! NSRegularExpression(pattern: "\"((http)s?://.*?)\"", options: [])

try?এবং লুপ try!থেকে কমপক্ষে 13 বাইট সংরক্ষণ করুন do-try-catch। নোট করুন যে []বিকল্পগুলির পরিবর্তে খালি অ্যারে ( ) এ গিয়ে আপনি কমপক্ষে আরও একটি বাইট সংরক্ষণ করুন nil


3

অ্যারে হ্রাস করা হচ্ছে

সঙ্গে Iterating for-in loopsঅভ্যন্তরের উপাদানগুলির যোগফলের মতো একটি একক মান পাওয়ার জন্য অ্যারের মাধ্যমে বা এর উপাদানগুলির পণ্যটি আসলে এটি কতটা সহজ for আপনি কেবল reduce()পদ্ধতিটি ব্যবহার করতে পারেন । কিছু উদাহরণ:

var array = [1,2,3,4,5,6,7]

সাথে অ্যারেতে উপাদানগুলি যুক্ত করা হচ্ছে for-inলুপগুলি :

var sum = 0

for item in array{
    sum += item
}
print(sum)

এটিকে সরল করা যায়:

print(array.reduce(0, +))

এবং ইন-লুপগুলির সাথে অ্যারের অভ্যন্তরের উপাদানগুলির পণ্য পাওয়া:

var multiplier = 1
for item in array{
    multiplier *= item
}
print(multiplier)

এটিকে হ্রাস করা যায়:

print(array.reduce(1, *))

আপনি নিজে নিজে **কল করে ফাংশনটি ঘোষণা করে আরও বাইট হারাবেন না pow?
জাল

@ জাল হ্যাঁ, তবে আপনি যদি ১০ বার কল করেন তবে এটি অল্প পরিমাণে বাইট সংরক্ষণ করে। প্রকৃতপক্ষে সেরা গল্ফিং কৌশল নয়, তবে এটি কেবল আরেকটি সম্ভাব্য সহায়তা। এটি বিশেষ করে পাউয়ের জন্য নয়, অন্যান্য ক্রিয়াকলাপগুলির জন্য যেমন প্রধান সংখ্যাগুলি অনুসন্ধান করার জন্য, আপনি যদি 3 বার এটি করেন তবে এটি একটি বিশাল পরিমাণ বাইট সংরক্ষণ করে
জনাব এক্সকোডার

2

সুইফ্টের টেরিনারি অপারেটরটি অত্যন্ত সংক্ষেপযুক্ত: condition ? action : otherক্রিয়া

শর্তটি যদি সত্য হয় তবে একটি কাজ করুন, না হলে অন্য কিছু করুন।

textColor = bgIsBlack ? .white : .black

এটি textColorব্যাকগ্রাউন্ড কালো হলে সাদা, বা ব্যাকগ্রাউন্ড অন্য কোনও রঙের হয়ে থাকলে সাদা করে তোলে ।

নিল কোয়েলেসিং অপারেটর আরও নিখুঁত: a ?? b

ধরা যাক আপনি একটি নির্দিষ্ট কীটির জন্য জেএসএন পরীক্ষা করছেন যাতে আপনি কীটির মান শিরোনাম পাঠ্য হিসাবে উপস্থাপন করতে পারেন। যদি কীটি উপস্থিত না থাকে (যেমন মান শূন্য হয়), আমরা শিরোনাম ডিফল্ট পাঠ্য দিতে চাই।

title = keysValue ?? "Not Available"

2

শুমার

আপনি সংগ্রহে কোনও অবজেক্টের (বা মানের ধরণের) পাশাপাশি তার সূচকের রেফারেন্স পেতে সংগ্রহের ধরণ forEachথেকে চেইন করতে পারেন enumerated():

[1,2,3,4,5].enumerated().forEach{print($0,$1)}

অথবা

for (c,i) in [1,2,3,4,5].enumerated(){print(c,i)}

বা (এমনকি আরও ছোট CountableClosedRangeসিনট্যাক্স)

(1...5).enumerated().forEach{print($0,$1)}

ছাপে:

0 1
1 2
2 3
3 4
4 5

2

সাবস্ট্রিং

কখনও কখনও, আপনি খাঁটি সুইফট প্রকারের পরিবর্তে ফাউন্ডেশনের ধরণগুলিতে ফিরে এসে বাইটগুলি সংরক্ষণ করতে পারেন। একটি NSStringবনাম একটি সুইফট Stringপ্রকারের একটি স্ট্রিংয়ের অ্যাক্সেসের সাথে তুলনা করুন :

let x:NSString = "hello world"
x.substringToIndex(5) // "hello"

let y = "hello world"
y.substringToIndex(y.startIndex.advancedBy(5)) // "hello"

এমনকি 9 টি অক্ষর xএকটি হিসাবে ঘোষণা করে হারিয়ে গেলেও NSStringআপনি ফাউন্ডেশন ধরণের ব্যবহার করে 25 টি বেশি সঞ্চয় করেন, যেহেতু সুইফট প্রকারের জন্য বনাম একটি কাঠামো ( ) এর পরামিতি হিসাবে substringToIndexগ্রহণ করে ।IntNSStringIndexString.CharacterView.IndexString

আমার লক্ষ্য করা উচিত যে ফাউন্ডেশন ধরণের প্রাপ্যতা একাধিক প্ল্যাটফর্মের (ওএস এক্স, লিনাক্স, ইত্যাদি) এর মধ্যে পৃথক হতে পারে। বেশিরভাগ ফাউন্ডেশন ক্লাসগুলি NSUnimplementedসুইফটের মুক্ত-উত্স সংস্করণে রয়েছে।


2

.map ()

ট্রেলিং .map()ক্লোজার সিনট্যাক্সের সাথে একত্রিত হওয়া লুপগুলি আরও শক্ত করতে পারে। আমরা পুনরুক্তি করতে চাই এমন জিনিসগুলিকে একটি অ্যারেতে রাখতে পারি, তারপরে .map()প্রতিটি উপাদানটিতে কিছু ক্রিয়া করতে ব্যবহার করতে পারি।

উদাহরণস্বরূপ, আমরা .map()সেই পুরাতন চেস্টনট, ফিজবজকে এক লাইনে লিখতে পারি।

var d: [Int] = Array(1...100)

d.map{$0%15 == 0 ? print("Fizzbuzz") : $0%3 == 0 ? print("Fizz") : $0%5 == 0 ? print("Buzz") : print($0)}

গল্ফের বাইরেও .map()পুনরাবৃত্তি হ্রাস করতে সহায়তা করতে পারে। উদাহরণস্বরূপ, ধরুন আপনার প্রোগ্রাম আছে যা আপনার প্রয়োজন এমন একটি মতামত রয়েছে। আপনি দেখার জন্য অ্যাঙ্করগুলিকে একটি বেনামে অ্যারে .map()রাখতে পারেন এবং প্রতিটি সীমাবদ্ধতার .isActiveসত্য হিসাবে সেট করতে এটি চালিয়ে যেতে পারেন:

_ = [
        view.topAnchor.constraint(equalTo: view.topAnchor, constant: 40),
        view.widthAnchor.constraint(equalTo: view.widthAnchor),
        view.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        view.bottomAnchor.constraint(equalTo: view.bottomAnchor)
    ].map { $0.isActive = true }

1
forEachআপনার দ্বিতীয় উদাহরণ ব্যবহার করা ভাল না ? mapসত্যই একটি অ্যারের সামগ্রী রূপান্তর করার জন্য ব্যবহার করা উচিত, এবং পুনরাবৃত্তি শর্টকাট হিসাবে নয়। এই ক্ষেত্রে, আপনি ফলাফলটি বাতিল করছেন।
জাল

1

টিপলস ব্যবহার করে নিয়ন্ত্রণ ফ্লো স্ট্রাকচারগুলিতে গল্ফিং পরিবর্তনশীল অ্যাসাইনমেন্ট

আপনি কোনও whileলুপ ব্যবহার করতে চান তা বিবেচনা করুন এবং আপনি শর্ত এবং ব্লক উভয় ক্ষেত্রে একই জিনিসটি ব্যবহার করতে চান। তারপরে, একটি টিপলে একটি ইনলাইন অ্যাসাইনমেন্ট সম্ভবত সাহায্য করবে। আপনার গুণাবলী যত দীর্ঘ, ভাল! এটি বিবেচনা করুন (3 বাইট সংক্ষিপ্ত):

func f(s:[Int]){var k=s,i=0;while(i=k.count,i>0).1{print(i,i+k[i-1]);k.removeLast();}}

এটার উপরে:

func g(s:[Int]){var k=s,i=0;while k.count>0{i=k.count;print(i,i+k[i-1]);k.removeLast();}}

(i=k.count,i>0).1অংশটি লক্ষ্য করুন , যা বেশ আকর্ষণীয়।


হারমান লাউস্টেইনের একটি উত্তর থেকে অনুপ্রাণিত ।


1

স্ট্রিংগুলি পুনরাবৃত্তি করছে

দুর্ভাগ্যক্রমে, সুইফট *একইভাবে পাইথনের সাথে স্ট্রিং গুণকে সমর্থন করে না । পরিবর্তে আপনি ব্যবহার করতে পারেন এমন একটি ভাল পদ্ধতি হ'ল String(repeating:count:), কিন্তু দুর্ভাগ্যক্রমে এটি সত্যই গোলাপী নয়। এই দুটি পদ্ধতির তুলনা করুন:

var a=String(repeating:"abc",count:3)

এবং

var a="";for _ in 0..<3{a+="abc"}

দ্বিতীয়টি হ'ল কয়েক বাইট সংক্ষিপ্ত, তবে এটি বন্ধে ব্যবহার করা যায় না ... আরও ভাল, এবং এটি ক্লোজারগুলিতেও কাজ করে:

(0..<3).map{_ in"abc"}.joined()

এবং যদি আমি একাধিকবার এটি করি? ভাল, আপনি ব্যবহার করতে পারেন String.init()। এখন, এটি প্রচুর বাইট সংরক্ষণ করতে পারে। উদাহরণস্বরূপ (68 বাইট):

let k=String.init(repeating:count:)
print(k("abcd",9)+k("XYZxyz",9))

(74 বাইট) এর পরিবর্তে:

print(String(repeating:"abcd",count:9)+String(repeating:"XYZxyz",count:9))

বা (70 বাইট):

var f={String(repeating:$0,count:$1)}
print(f("abcd",9)+f("XYZxyz",9))

তবে নিশ্চিত হয়ে নিন যে আপনার স্ট্রিং যথেষ্ট দীর্ঘ। আপনি ব্যবহার করে থাকেন String(repeating:"abc",3), এটা হয় অনেক ভাল ব্যবহার করতে "abcabcabc"পরিবর্তে।


+1 কারণ আমার কোনও ধারণার ভেরিয়েবলগুলি সে রকম আরম্ভকারী হতে পারে।
ড্যানিয়েল

1

আমদানি

আপনি প্রতিস্থাপন করতে পারেন import Foundationসঙ্গে import UIKit, 5 খাটো বাইট হিসাবে UIKit আমদানি ফাউন্ডেশন ইতিমধ্যে আছে।


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