AMcoder - javascript, python, java, html, php, sql

Ի՞նչ է անում Swift կոմպիլյատորը իմ վերադարձի տեսակի հետ: Դա ինչ-որ կերպ քասթինգ է:

Ես ունեմ մի մեթոդ.

func allRegions() -> [MappedRegion] {
    return self.items.lazy.compactMap { item in item.valveAny }.flatMap { valve in valve.regions }
}

Ես անկեղծորեն զարմացա, որ սա ստացվեց: Ես այստեղ ծույլ գործեր եմ անում, բայց, ըստ երևույթին, կա ծույլ հաջորդականություն, որը վերածվում է MappedRegion-ի հաջորդականության:

Այնուհետև ես որոշ խեղճ ժամանակներ էի անում և փոփոխեցի ֆունկցիան՝ կարդալու համար.

func allRegions() -> [MappedRegion] {
    let startTime = Date()
    let result = self.items.lazy.compactMap { item in item.valveAny }.flatMap { valve in valve.regions }
    self.sumRender += (Date() - startTime)
    return result
}

Բայց դա ստեղծեց սխալ.

Cannot convert return expression of type 'LazySequence<FlattenSequence<LazyMapSequence<LazyMapSequence<LazyFilterSequence<LazyMapSequence<LazySequence<[StatusRowItem]>.Elements, ValveAbstract?>>, ValveAbstract>.Elements, [MappedRegion]>>>' (aka 'LazySequence<FlattenSequence<LazyMapSequence<LazyMapSequence<LazyFilterSequence<LazyMapSequence<Array<StatusRowItem>, Optional<ValveAbstract>>>, ValveAbstract>, Array<MappedRegion>>>>') to return type '[MappedRegion]'

Դա ի սկզբանե անակնկալ էր։ Ես գտա, որ եթե ես նշեի result-ի վերադարձի տեսակը որպես [MappedRegion], բոլորը երջանիկ էին (օրինակ՝ let result:[MappedRegion] = ...):

Ի՞նչ է կատարվում այստեղ։ Ես հասկանում եմ, որ սկզբնական մեկ տողի ֆունկցիան ենթադրում է արդյունքի տեսակը որպես [MappedRegion], այնպես որ ես, հավանաբար, շատ օգուտներ չեմ ստանում ծույլ օգտագործումից: Բայց ինչն է ինձ շփոթեցնում, այն է, որ այս պարտադրանքը ծույլ հաջորդականությունից դեպի ֆիքսված զանգված ավտոմատ կերպով հիշեցնում է C-ով քասթինգը, և ես մտածեցի, որ Սվիֆթը քասթինգ չի արել:


  • Դա կարող է լինել կոմպիլյատորը, որն օպտիմիզացնում է lazy զանգը, քանի որ հայտնաբերում է, որ դրա կարիքը չի լինի: 17.10.2020

Պատասխանները:


1

Ոչ, քասթինգ չի կատարվում։ Պարզապես կան երկու տարբեր flatMap ֆունկցիաներ, որոնք կանչվում են: LazyMapSequence ունի երկու flatMap(_:) ֆունկցիա (լավ, տեխնիկապես չորս, բայց երկուսը հնացած են):

Ձեր առաջին կոդի բլոկում այս ֆունկցիան ենթադրվում է (քանի որ այս տարբերակը flatMap-ն ունի վերադարձի տեսակ, որը համապատասխանում է ձեր allRegions ֆունկցիայի վերադարձի տեսակին).

func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence

Եվ ձեր երկրորդ կոդի բլոկում այս ֆունկցիան ենթադրվում է (քանի որ այնտեղ ձեր տեղական փոփոխականի վրա տիպի անոտացիա չկա, որը ստիպում է նրան ընտրել flatMap-ի վերը նշված տարբերակը):

func flatMap<SegmentOfResult>(_ transform: @escaping (Element) -> SegmentOfResult) -> LazySequence<FlattenSequence<LazyMapSequence<LazyMapSequence<Base, Element>, SegmentOfResult>>> where SegmentOfResult : Sequence
17.10.2020
Նոր նյութեր

Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..