"% অনুপলব্ধ: এর পরিবর্তে ট্রান্সকাটিংআরমাইন্ডার ব্যবহার করুন" এর অর্থ কী?


103

কোনও এক্সটেনশনের কোড ব্যবহার করার সময় আমি নিম্নলিখিত ত্রুটিটি পেয়েছি, তারা নিশ্চিত না যে তারা কেবল কোনও আলাদা অপারেটর ব্যবহার করতে বলছে বা কোনও ইন্টারনেট অনুসন্ধানের ভিত্তিতে অভিব্যক্তিতে মানগুলি সংশোধন করছে কিনা।

ত্রুটি:% অনুপলব্ধ: পরিবর্তে কাটাকাটি ছাড়াই ব্যবহার করুন

এক্সটেনশন কোড:

extension CMTime {
    var durationText:String {
        let totalSeconds = CMTimeGetSeconds(self)
        let hours:Int = Int(totalSeconds / 3600)
        let minutes:Int = Int(totalSeconds % 3600 / 60)
        let seconds:Int = Int(totalSeconds % 60)

        if hours > 0 {
            return String(format: "%i:%02i:%02i", hours, minutes, seconds)
        } else {
            return String(format: "%02i:%02i", minutes, seconds)
        }
    }
}

মিনিট এবং সেকেন্ডের ভেরিয়েবলগুলি সেট করার সময় ত্রুটি ঘটে।


1
আমি মনে করি সিএমটাইমগেটসেকেন্ডগুলি ভাসমান ফিরিয়ে দেয়
জম্বি

3
এর অর্থ হল যে %অপারেটরটি অনুপলব্ধ এবং এর truncatingRemainderপরিবর্তে আপনার পদ্ধতির মতো কিছু ব্যবহার করা উচিত ।
ম্যাট

1
আপনি কেবলমাত্র Float64ছাড়াও মডুলো ব্যবহার করতে পারবেন না Int; সুতরাং: let minutes:Int = Int(totalSeconds) % 3600 / 60; let seconds:Int = Int(totalSeconds) % 60সঠিক উপায়।
হোলএক্স

উত্তর:


172

CMTimeGetSeconds()একটি ভাসমান পয়েন্ট নম্বর ( Float64ওরফে Double) প্রদান করে। সুইফট 2 এ আপনি ভাসমান পয়েন্ট বিভাগের বাকী অংশগুলি গণনা করতে পারেন

let rem = 2.5 % 1.1
print(rem) // 0.3

সুইফ্ট 3 এ এটি করা হয়

let rem = 2.5.truncatingRemainder(dividingBy: 1.1)
print(rem) // 0.3

আপনার কোড প্রয়োগ করা:

let totalSeconds = CMTimeGetSeconds(self)
let hours = Int(totalSeconds / 3600)
let minutes = Int((totalSeconds.truncatingRemainder(dividingBy: 3600)) / 60)
let seconds = Int(totalSeconds.truncatingRemainder(dividingBy: 60))

তবে, এই বিশেষ ক্ষেত্রে সময়কালটিকে প্রথম স্থানে পূর্ণসংখ্যায় রূপান্তর করা আরও সহজ:

let totalSeconds = Int(CMTimeGetSeconds(self)) // Truncate to integer
// Or:
let totalSeconds = lrint(CMTimeGetSeconds(self)) // Round to nearest integer

তারপরে পরবর্তী লাইনগুলি সরল করুন

let hours = totalSeconds / 3600
let minutes = (totalSeconds % 3600) / 60
let seconds = totalSeconds % 60

24

%মডুলাস অপারেটরটি কেবল পূর্ণসংখ্যার ধরণের জন্য সংজ্ঞায়িত করা হয়। ভাসমান-পয়েন্টের ধরণের জন্য, আপনার পছন্দসই আইইইই 754 বিভাগ / বাকী আচরণ সম্পর্কে আরও সুনির্দিষ্ট হওয়া দরকার, সুতরাং আপনাকে কোনও পদ্ধতিতে কল করতে হবে: হয় remainderবা হয় truncatingRemainder। (আপনি যদি ভাসমান-পয়েন্ট গণিত করছেন তবে আপনার অবশ্যই এটির যত্ন নেওয়া দরকার এবং প্রচুর অন্যান্য জিনিসপত্র রয়েছে বা আপনি অপ্রত্যাশিত / খারাপ ফলাফল পেতে পারেন))

যদি আপনি প্রকৃতপক্ষে পূর্ণসংখ্যার মডুলাসটি করতে চান CMTimeGetSecondsতবে ব্যবহারের আগে আপনাকে পূর্বেকারের মানটি পূর্ণসংখ্যায় রূপান্তর করতে হবে %। (মনে রাখবেন যে আপনি যদি এটি করেন তবে আপনি ভগ্নাংশের সেকেন্ডগুলি সরিয়ে ফেলবেন ... আপনি কোথায় ব্যবহার করছেন CMTimeতা গুরুত্বপূর্ণ হতে পারে তার উপর নির্ভর করে আপনি কি মিনিটসেকেন্ড : সেকেন্ড: ফ্রেম চান?)

কিভাবে আপনি উপস্থাপন করতে চান তার উপর নির্ভর CMTimeআপনার ইউআই মান, এটা ভালো হতে সেকেন্ড মান বের এবং এটি পাস হতে পারে NSDateFormatterবা NSDateComponentsFormatterতাই আপনি উপযুক্ত লোকেল সমর্থন পেতে।


10

দ্রুত মডিউল সিনট্যাক্স দ্রুত 3 এ এনে দিন:

এই সিনট্যাক্সটি এখানে অ্যাপল অফিসিয়াল সুইফ্ট মেলিং তালিকায় আসলে প্রস্তাবিত হয়েছিল তবে কোনও কারণে তারা কম মার্জিত সিনট্যাক্সের জন্য বেছে নিয়েছিল।

infix operator %%/*<--infix operator is required for custom infix char combos*/
/**
 * Brings back simple modulo syntax (was removed in swift 3)
 * Calculates the remainder of expression1 divided by expression2
 * The sign of the modulo result matches the sign of the dividend (the first number). For example, -4 % 3 and -4 % -3 both evaluate to -1
 * EXAMPLE: 
 * print(12 %% 5)    // 2
 * print(4.3 %% 2.1) // 0.0999999999999996
 * print(4 %% 4)     // 0
 * NOTE: The first print returns 2, rather than 12/5 or 2.4, because the modulo (%) operator returns only the remainder. The second trace returns 0.0999999999999996 instead of the expected 0.1 because of the limitations of floating-point accuracy in binary computing.
 * NOTE: Int's can still use single %
 * NOTE: there is also .remainder which supports returning negatives as oppose to truncatingRemainder (aka the old %) which returns only positive.
 */
public func %% (left:CGFloat, right:CGFloat) -> CGFloat {
    return left.truncatingRemainder(dividingBy: right)
}

এই সহজ দ্রুতগতি 3 মাইগ্রেশন ডগা (35k এলওসি / মাইগ্রেশন 8-দিন) অনেক অর্ন্তদৃষ্টি সঙ্গে একটি আরো ব্যাপক দ্রুতগতি 3 মাইগ্রেশন নির্দেশিকা অংশ http://eon.codes/blog/2017/01/12/swift-3-migration /


1
এটি একটি ভাল, আকর্ষণীয় তথ্য সরবরাহ করে এবং Q. এর উত্তর দেওয়ার চেষ্টা করে
Jakub Truhlář

3
@ জাকুব ট্রুহলář ... ম্যান, থেক্স আইএমও এটি ছিল আমার সেরা সুইফট 3 মাইগ্রেশন ফিক্স। লোকেরা এটিকে নিচে ভোট দিয়েছে বলে বিশ্বাস করতে পারে না। মডুলো একটি গুরুত্বপূর্ণ ধারণা এবং পাটিগণিত রয়েছে এমন প্রতিটি কোড বইতে ভাবা হয়। কোডটিতে অ্যারিমেটিক যতটা সম্ভব কমপ্যাক্টভাবে লেখা উচিত, এটিকে ভার্বোজ বানানো কোনও অর্থহীন নয়। যখন আপনি পৃথক ভেরিয়েবলের অর্থ কী তা বোঝার বিরোধিতা করে সম্পূর্ণ চিত্রটি দেখতে পাওয়ায় পাটিগণিতগুলি বোঝার আমাদের জ্ঞানীয় ক্ষমতা বৃদ্ধি পায়। আইএমও বিস্তৃত পরিবর্তনশীল নামকরণ ব্যবসায়ের যুক্তিতে গুরুত্বপূর্ণ তবে গাণিতিক নয়, একেবারে বিপরীত।
ইওনিস্ট

2
@ গিটসাইক মডুলো একটি গুরুত্বপূর্ণ ধারণা তবে এটি কেবল পূর্ণসংখ্যার জন্যই বিদ্যমান। আপনার পার্থক্যটি বোঝা উচিত।
সুলতান

5
@ গিটসিঙ্ক মডিউলো অপারেশনটি কেবল পূর্ণসংখ্যার জন্যই বিদ্যমান। আপনি বাকী সম্পর্কে কথা বলছেন। দশমিক মানগুলিতে দুই ধরণের অবশেষ থাকে। এই কারণেই সুইফট অপারেশনটিকে সুস্পষ্ট করার সিদ্ধান্ত নিয়েছে। দ্বিগুণ মানগুলিতে একটি পূর্ণসংখ্যার অবশিষ্ট ( কাটা বাকি ) কে গণনা করা খুব সাধারণ বিষয় নয় ।
সুলতান

1
@ গিটসাইক রয়েছে remainder(dividingBy:)এবং truncatingRemainder(dividingBy:)। আপনি উভয়ের জন্য ডক্সটি পড়তে চাইতে পারেন। এছাড়াও, সি ++ স্ট্যাকওভারফ্লো.com
সুলতান

2

আমি দেখতে পেয়েছি যে সুইফট 3 এ নিম্নলিখিতগুলি কাজ করে:

    let minutes = Int(floor(totalSeconds / 60))
    let seconds = Int(totalSeconds) % 60

যেখানে totalSecondsএকটি TimeInterval( Double)।


3
মেঝে এবং বৃত্তাকার মিশ্রন করা ভাল ধারণা নয়, যেমন totalSeconds = 59.8আপনার কোডের গণনা 0 মিনিট 0 সেকেন্ডের জন্য।
মার্টিন আর

হ্যাঁ আপনি ঠিক. আসলে, এর roundমোটেই দরকার নেই।
benwiggy

0

ভাসমান পয়েন্ট সংখ্যাগুলির জন্য পৃথক মডুলো অপারেটর তৈরি করার দরকার নেই, যদি না আপনি মনে করেন যে কোডটি আরও নিরাপদ করে। আপনি %যেমন ভাসমান পয়েন্ট সংখ্যা গ্রহণ করতে অপারেটরটিকে ওভারলোড করতে পারেন:

func %<N: BinaryFloatingPoint>(lhs: N, rhs: N) -> N {
    lhs.truncatingRemainder(dividingBy: rhs)
}

ব্যবহার

let a: Float80 = 10
let b: Float80 = 3
print(a % b)

আপনি এখন %একই টাইয়ের যে কোনও দুটি ফ্লোটিং পয়েন্ট নম্বর ব্যবহার করতে পারেন ।

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