ข้อผิดพลาดในการแบ่งส่วนคอมไพเลอร์อย่างรวดเร็วเมื่อสร้าง


101

การเพิ่มheightคุณสมบัติที่คำนวณ (สะดวก) ลงUIViewในUIViewExtension.swiftไฟล์ของฉันทำให้คอมไพเลอร์ Swift segfault ... มีอะไรผิดปกติเกิดขึ้นที่นี่?

0  swift                    0x00000001061e5608 llvm::sys::PrintStackTrace(__sFILE*) + 40
1  swift                    0x00000001061e5af4 SignalHandler(int) + 452
2  libsystem_platform.dylib 0x00007fff894da5aa _sigtramp + 26
3  libsystem_platform.dylib 0xb03939841e997c88 _sigtramp + 2504775416
4  swift                    0x00000001064c8bb9 swift::NominalTypeDecl::getMembers(bool) const + 41
5  swift                    0x00000001055efab9 swift::irgen::ClassMetadataLayout<(anonymous namespace)::FindClassMethodIndex>::addClassMembers(swift::ClassDecl*) + 329
6  swift                    0x00000001055e97b2 swift::irgen::emitVirtualMethodValue(swift::irgen::IRGenFunction&, llvm::Value*, swift::SILType, swift::SILDeclRef, swift::CanTypeWrapper<swift::SILFunctionType>, swift::ResilienceExpansion) + 434
7  swift                    0x00000001056550d3 swift::SILVisitor<(anonymous namespace)::IRGenSILFunction, void>::visit(swift::ValueBase*) + 42611
8  swift                    0x000000010564a266 swift::irgen::IRGenModule::emitSILFunction(swift::SILFunction*) + 8678
9  swift                    0x00000001055cb6f8 swift::irgen::IRGenModule::emitGlobalTopLevel() + 184
10 swift                    0x00000001056376e3 performIRGeneration(swift::IRGenOptions&, swift::Module*, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, swift::SourceFile*, unsigned int) + 1859
11 swift                    0x0000000105638033 swift::performIRGeneration(swift::IRGenOptions&, swift::SourceFile&, swift::SILModule*, llvm::StringRef, llvm::LLVMContext&, unsigned int) + 51
12 swift                    0x00000001055aa65a frontend_main(llvm::ArrayRef<char const*>, char const*, void*) + 4842
13 swift                    0x00000001055a935d main + 1533
14 libdyld.dylib            0x00007fff8a82e5fd start + 1

 

1.  While emitting IR SIL function @_TFCSo6UIViewg6heightSd for 'anonname=0x7ff422892fd0' at <path redacted>/UIViewExtension.swift:60:5
<unknown>:0: error: unable to execute command: Segmentation fault: 11
<unknown>:0: error: swift frontend command failed due to signal (use -v to see invocation)
Command /Applications/Xcode6-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift failed with exit code 254

หากต้องการข้อมูลเพิ่มเติมในการถอดรหัสนี้เพียงแสดงความคิดเห็น ขอบคุณ!

แก้ไข:

นี่คือ. xcodeproj ที่เกี่ยวข้องซึ่งส่งคืนข้อผิดพลาดของคอมไพเลอร์ของคำถามนี้ ดาวน์โหลดที่นี่


7
คอมไพเลอร์ไม่ควร segfault หากเป็นปัญหาใหม่ให้ยื่นรายงานข้อบกพร่อง
Karoly Horvath

3
ดูเหมือนบั๊กคอมไพเลอร์ คุณควรรายงานให้ Apple ทราบเพื่อให้พวกเขาจัดการได้
Chuck

11
คอมไพเลอร์ได้รับการ seg ผิดพลาดไปทางซ้ายและขวาขณะที่ฉันย้ายโครงการ Objective-C ไปยัง Swift เป็นเรื่องน่าท้อใจที่จะพูดน้อยที่สุด
aleclarson

1
@aleclarson ฉันคิดว่าเวอร์ชันที่วางจำหน่ายจะทำงานได้ดีขึ้น แต่ถ้าคุณพบข้อบกพร่องฉันจะรายงานพวกเขาเนื่องจากนั่นอาจเป็นวิธีเดียวที่พวกเขาจะได้รับการแก้ไขก่อนปล่อย
Joachim Isaksson

6
ฉันหวังเป็นอย่างยิ่งว่า Swift จะพร้อมใช้งานทันทีที่ออกจากประตู กำลังรอครับ! :)
aleclarson

คำตอบ:


75

ฉันมีข้อผิดพลาดนี้เพราะฉันกำลังทำสิ่งนี้:

if(currentMeal?.State == .Deleted){

}

แทน

if(currentMeal!.State == .Deleted){

}

ดังนั้นฉันคิดว่าตัวเลือกไม่ได้ถูกคลายออกหากเงื่อนไขอาจทำให้เกิดข้อผิดพลาดนี้


3
นั่นก็เป็นสาเหตุสำหรับฉันเช่นกัน แต่นั่นควรจะถูกต้องใช่ไหม? มันเป็นเพียงข้อผิดพลาดของคอมไพเลอร์เท่านั้น
DeFrenZ

เหมือนกัน. การตรวจสอบ enum เสริม หวังว่าพวกเขาจะแก้ไขได้
Mente

รหัสที่ถูกต้องจะเป็น: if (currentMeal.State == .Deleted) {} ​​เป็น Swift อย่างมีประโยชน์เกินพิกัด == สำหรับสองตัวเลือกที่เท่าเทียมกัน โพสต์ของ Fjohn ค่อนข้างอันตราย
mattyohe

1
มันเกี่ยวกับข้อผิดพลาดในการคอมไพล์โค้ดที่ฉันผ่านมานั้นอันตรายหากไม่ได้รับการยืนยันตัวแปรมาก่อน แล้วรหัสของคุณจะเป็นอย่างไรหาก currentMeal เป็นศูนย์? มันเหมือนกันไม่ใช่เหรอ? ช่วยอธิบายหน่อยได้ไหมว่าทำไมรหัสของฉันถึงอันตรายกว่าของคุณได้โปรด รวดเร็วใช้ประโยชน์จากทางเลือกโดยไม่ต้องใช้ "?" เหรอ?
Fjohn

ขอบคุณนี่ก็เป็นกรณีของฉันเช่นกัน Swift ทำให้ฉันประหลาดใจมาตลอด แต่สิ่งนี้เกินขีด จำกัด
CodeBrew

26

เมื่อคุณเรียกใช้ segfault ของคอมไพเลอร์ใน Swift คุณจะไม่ได้รับหมายเลขบรรทัดที่สะดวกและข้อความแสดงข้อผิดพลาด นี่คือวิธีที่คุณสามารถติดตามปัญหาได้:

  1. สร้างไฟล์ใหม่ที่เรียกว่าSegFaultDebugger.swiftในโปรเจ็กต์ของคุณ
  2. ในไฟล์ใหม่นี้ให้กำหนดส่วนขยายของคลาสที่ทำให้คุณมีปัญหา
  3. SegFaultDebugger.swiftย้ายกลุ่มของวิธีการจากไฟล์หลักในการ
  4. รวบรวม.

ณ จุดนี้หนึ่งในสามสิ่งที่เกิดขึ้น:

  • คุณยังได้รับ segfault ในไฟล์ต้นฉบับ : ย้ายวิธีการจากกลับไปไฟล์ต้นฉบับและย้ายชุดที่แตกต่างกันของวิธีการเข้าSegFaultDebugger.swift SegFaultDebugger.swiftทำซ้ำ
  • คุณได้รับความผิดพลาดในSegFaultDebugger.swift : เยี่ยมมาก! ตอนนี้ใช้การค้นหาแบบไบนารีเพื่อตรึง segfault ลงในวิธีการเฉพาะจนกว่าคุณจะสามารถทราบได้ว่าโครงสร้างใดเป็นสาเหตุ
  • คุณได้รับข้อผิดพลาดของคอมไพเลอร์ที่มีความหมาย : เยี่ยมมาก! แก้ไขข้อผิดพลาด เมื่อทุกอย่างรวบรวมได้แล้วให้ย้ายวิธีการของคุณกลับไปที่ไฟล์ต้นฉบับ

1
ขอบคุณ! สิ่งนี้ช่วยได้หลายชั่วโมงหลังจากเกาหัวของฉัน
dejavu89

1
นี่มีประโยชน์มาก! ในกรณีของฉันฉันมี NSFetchedResultsControllerDelegate ในส่วนขยายและมันก็เพียงพอที่จะรวมสิ่งนั้นกลับไปที่บล็อกคลาสหลัก
Mikael Grön

@ MikaelGrön - ขยายความได้ไหม คุณมีอะไรในส่วนขยายนี้?
RyanJM

แต่คุณจะรู้ได้อย่างไรว่าชั้นเรียนใดให้ประเด็นแก่คุณ?
สาธุ

@theReverend หากคุณไม่แน่ใจคุณจะต้องลองแต่ละคลาสในไฟล์ที่กระทำผิด แต่ swiftc ไม่ได้มีปัญหา segfault จริงๆในสองสามปี - ไม่แน่ใจว่าคำตอบของฉันเกี่ยวข้องอีกต่อไป
บิล

12

ฉันได้รับข้อผิดพลาดนี้ขณะขยายหนึ่งในโปรโตคอลของฉันและพิมพ์ผิดและอาร์กิวเมนต์ประเภทที่เป็นทางเลือก

protocol SomeProtocolName: class {
    var someProtocolVariable: String { get set }

    func someProtocolFunction(someProtocolVariable: String)
}

// MARK:
extension SomeProtocolName {
    func someProtocolFunction(someProtocolVariable: String?) {
        self.someProtocolVariable = someProtocolVariable
    }
}

ความแตกต่างในการขัดแย้งการทำงานStringในต้นแบบและString?ในส่วนขยายที่เกิดจากการแบ่งส่วนความผิดพลาด 11


3
ฉันได้รับสิ่งนี้ด้วย ดูเหมือนว่า Apple จะมีปัญหาบางอย่างกับการพิมพ์เสริม ประเด็นสำคัญอย่างหนึ่งคือเมื่อ! ใช้ภายในประเภทตัวแปร โดยค่าเริ่มต้นจะไม่เป็นทางเลือก แต่คอมไพเลอร์จะสับสน
user1122069

@ user1122069 เห็นด้วยโปรโตคอลมีปัญหาบางอย่างเหลืออยู่ หวังว่ารุ่นต่อไปปัญหานี้จะได้รับการแก้ไข
victor.vasilica

ฉันไม่ได้พูดถึงโปรโตคอลโดยทั่วไป ฉันเพิ่งเรียนรู้อะไรมา! ทำภายในตัวแปร แต่ IDE และคอมไพเลอร์มักไม่ได้รับข้อผิดพลาดที่ถูกต้องสำหรับ!
user1122069

@ user1122069 แย่จังเลย
victor.vasilica

สิ่งนี้เกิดขึ้นกับฉันเมื่อเพิ่มรายการจำนวนมากในอาร์เรย์
aguilarpgc

9

ฉันมีข้อผิดพลาดนี้เช่นกันและฉันแก้ไขดังนี้:

ตรวจสอบโปรเจ็กต์ของคุณและดูว่าไฟล์ใดถูกใช้สองครั้งและลบออกหนึ่งไฟล์หรือลบและเพิ่มใหม่ทั้งหมด

ข้อผิดพลาดใน Xcode ของฉัน:

: 0: error: filename "AttributedString.swift" ใช้สองครั้ง: '/Users/.../CNJOB/CNJOB/AttributedString.swift' และ '/Users/.../CNJOB/CNJOB/AttributedString.swift'

: 0: หมายเหตุ: ชื่อไฟล์ใช้เพื่อแยกการประกาศส่วนตัวที่มีชื่อเดียวกัน

: 0: error: filename "APIClient.swift" ใช้สองครั้ง: '/Users/.../CNJOB/CNJOB/APIClient.swift' และ '/Users/.../CNJOB/CNJOB/APIClient.swift'

: 0: หมายเหตุ: ชื่อไฟล์ใช้เพื่อแยกการประกาศส่วนตัวที่มีชื่อเดียวกัน

Command / Applications / Xcode 3.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc ล้มเหลวด้วยรหัสทางออก 1


8

ใน Xcode 7 คุณสามารถคลิกที่ข้อผิดพลาดใน Debug Navigator และคุณจะเห็นมุมมองเพิ่มเติมของข้อขัดข้อง การคลิกปุ่มแฮมเบอร์เกอร์ทางด้านขวาจะเป็นการขยายข้อผิดพลาดและหากคุณเลื่อนลงไปจนสุดด้านล่างของข้อความแสดงข้อผิดพลาดที่ขยายคุณจะเห็นว่ามาจากที่ใด

ป้อนคำอธิบายภาพที่นี่

สำหรับฉันฉันมีข้อผิดพลาดในการแบ่งกลุ่มสองข้อ ในภาพด้านบนอันแรกคือลักษณะเมื่อยุบตัวที่สองคือเมื่อคุณขยายปุ่มแฮมเบอร์เกอร์ ที่ด้านล่างสุดของกล่องสีเทาที่ขยายออกคุณจะเห็นข้อความแจ้งว่าคอมไพเลอร์ขัดข้องที่ใด

อย่างไรก็ตามโปรดทราบว่าในบางครั้งข้อความแสดงข้อผิดพลาดอาจให้ข้อมูลไม่เพียงพอดังนั้นแม้ว่าข้อความจะบอกคุณว่าเกิดข้อผิดพลาดที่ใด แต่ก็ไม่ได้บอกสาเหตุและวิธีแก้ไขเสมอไป การกำจัดข้อผิดพลาดนี้ยังคงเป็นเรื่องที่ต้องคาดเดาอยู่มาก


1
สามารถติดตามข้อผิดพลาดจาก Navigator ได้ ขอบคุณสิ่งนี้ช่วยฉันแก้ไขข้อผิดพลาด!
Vishal Chandran

5

ฉันได้ค้นพบวิธีแก้ปัญหาง่ายๆจนกว่าปัญหาจะได้รับการแก้ไขในรุ่น Xcode / Swift ในอนาคต:

  • เพียงวางนามสกุลทั้งหมดที่ทำให้เกิดปัญหาใน.swiftไฟล์ที่กำลังใช้งาน

ในโครงการตัวอย่างที่คุณระบุให้วางเนื้อหาของ UIViewExtension.swift และ CALayerExtension.swift ด้านบน AppDelegate.swift

หวังว่านี่จะช่วยให้เราเขียนโค้ด Swift ที่ใช้งานได้จนกว่าปัญหาจะเคลียร์


4

สำหรับฉันการเพิ่มprivateความผิดพลาดคงที่ของ var คงที่:

private static var taskId = 0

2

ฉันมีข้อผิดพลาดในการแบ่งส่วนคอมไพเลอร์ในคำสั่งเช่นนี้:

someFunction(isFlagged ? "String1" : "String2")

ฉันทำคำสั่ง if-else แทนและใช้งานได้


1
Swift 3: คำตอบนี้ช่วยแก้ปัญหา segmentatio fault 11 ในหลาย ๆ โครงการ
Alessandro Ornano

ว้าวไม่น่าเชื่อ คอมไพเลอร์ Swift ให้ความรู้สึกเหมือนเวอร์ชันอัลฟ่าที่มีปัญหาเหล่านี้ทั้งหมด ขอบคุณสำหรับสิ่งนี้.
TGO

2

นอกจากนี้คุณยังสามารถมีปัญหานี้ได้หากคุณประกาศเงื่อนไขโดยมี Bool ที่ไม่ได้ติดตั้งเป็นคุณสมบัติ


1

ในกรณีของฉันโคลอนที่ใส่ผิดตำแหน่งระหว่างการแก้ไขสตริงทำให้ฉันเสีย (XCode 6.1.1)

ตัวอย่าง:

println("\(value1:value2)") 

เมื่อฉันตั้งใจจะทำ:

println("\(value1) : \(value2)")

1

ข้อผิดพลาดนี้เกิดขึ้นกับฉันเมื่อฉันพยายามแทนที่ตัวแปรที่อ่อนแอจากคลาสแม่

ในคลาสพื้นฐาน:

weak var stripeViewDelegate : StripeViewDelegate? = nil    

คลาสที่ได้รับ:

override weak var stripeViewDelegate : StripeViewDelegate? = nil {
    didSet {
        self.stripeView.delegate = stripeViewDelegate

    }

ข้อผิดพลาดหายไปเมื่อฉันลบออก=nilจากคลาสที่ได้รับ


1

ฉันพบข้อยกเว้นบางอย่างในวันนี้

class func createByAny(instance: Any?) -> ApiCollectionResponse { ... }

และสิ่งนี้แก้ไขได้:

class func createByAny(instance: Any) -> ApiCollectionResponse { ... }

เนื่องจากประเภท "Any" คือเหตุการณ์ประเภทใดก็ได้ "nil", "AnyObject", เป็นทางเลือก, ... :) ไม่สามารถเลือกได้จึงเป็นทางเลือกอยู่แล้ว

typealias Any = protocol<>

กรณีของฉันก็มีปัญหากับ "Any"
Adriano Spadoni

1

ข้อผิดพลาดนี้ยังเกิดขึ้นหากคุณประกาศตัวแปรที่มีประเภทตรงกับชื่อโดยไม่ได้ตั้งใจ:

    var sectionGroup: sectionGroup? { ... }

ซึ่งจะไม่เป็นปัญหาหากคุณทำตามหลักการตั้งชื่อของ Apple และใช้อักษรตัวพิมพ์ใหญ่ตัวแรกสำหรับประเภท ซึ่งเป็นไปได้ว่าทำไม Apple ถึงไม่สะดุด นอกจากนี้คำตอบของคุณดูเหมือนจะเหมือนกับของ @aminhotob
qwerty_so

1

พบข้อผิดพลาดนี้เนื่องจากประเภททั่วไปที่ไม่เกี่ยวข้องในฟังก์ชันตัวดำเนินการเช่น

func ==<T>(lhs: Foo, rhs: Foo) -> Bool {
  return lhs.bar == rhs.bar
}

ในกรณีของฉันการลบช่วย<T>แก้ปัญหาได้


ปัญหาเดียวกันที่นี่โดยทั่วไปดูเหมือนว่าการกำหนด generics ที่ไม่ได้ใช้จริงจะทำให้เกิดข้อผิดพลาดนี้
Kevin R

1

ในกรณีของฉันฉันได้ประกาศstructภายในไฟล์func. การย้ายstructไปยังระดับชั้นเรียนช่วยแก้ปัญหาได้

ตอนนี้ฉันเขียนสิ่งนี้แล้วฉันจำได้ว่าเคยมีปัญหากับstructinside funcs มาก่อน มันเป็นอย่างอื่นที่ไม่ใช่ข้อผิดพลาดในการแบ่งส่วน (ซึ่งดูเหมือนจะเป็นที่รู้จักใน Swift 1.2 เบต้า) OMG Apple คุณกำลังทำอะไรอยู่ที่นั่น?


ฉันมี 3 ตัวแปรในโครงสร้างและทำงานได้ดีการเพิ่มการเริ่มต้นครั้งที่ 4 ทำให้เกิดปัญหาการแบ่งส่วน การเปลี่ยนโครงสร้างเป็นชั้นเรียนสามารถแก้ไขได้สำหรับฉัน
Ehab Amer

1

ในกรณีของฉันข้อผิดพลาดนี้เนื่องจากฉันใช้ชื่อคลาสสำหรับตัวแปร

var MYClass : MYClass {
    get {
        return.....
    }
}

และสิ่งนี้ช่วยแก้ปัญหาของฉันได้

var myClass : MYClass {
    get {
        return.....
    }
}

1

กรณีของฉันสิ่งนี้เกิดขึ้นเมื่อฉันทำการเริ่มต้นแบบคงที่ไม่ถูกต้องในโปรโตคอล ฉันพบวิธีที่จะหลีกเลี่ยง แต่คอมไพเลอร์ไม่ควรสร้างข้อผิดพลาดในการแบ่งส่วนในขณะที่สร้าง

มีสามไฟล์ที่เกี่ยวข้อง โปรโตคอล NamedSegues.swift ซึ่งเป็น TableViewController แบบกำหนดเองที่ใช้โปรโตคอลที่มีการเรียกกลับ TableViewCell แบบกำหนดเองซึ่งมีการอ้างอิงถึงโปรโตคอลนี้เพื่อเรียกการโทรกลับ

//file1
import Foundation
protocol NamedSegues {
    func  executeSegueWithId(id: String) -> Void
    static func getDefault() -> NamedSegues  // This was required because of init requirement in CustomCellView
}


//file2
class CustomController: UITableViewController, NamedSegues {
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCellWithIdentifier("CustomCellID", forIndexPath: indexPath ) as! CustomCellView

        // Configure the cell...
       //App logic...

        cell.parent = self
}

 //Mark: NamedSegues
     func executeSegueWithId(id: String) ->() {
        NSLog("Received callback to execute segue: \(id)")
        //
    }

    static func getDefault() -> NamedSegues { // I think this must be where it threw up.
        return self as! NamedSegues
    }

}


//file3

import UIKit

class CustomCellView: UITableViewCell {

    var id: String = "NoName"
    var parent: NamedSegues = NamedSegues.getDefault() // This is where it was needed.


override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) {
        NSLog("Touched id: \(id)")


             parent.executeSegueWithId(id) // This is where parent was used.
     }
}

ฉันเข้าใจมันโดยใช้?

ในไฟล์โปรโตคอล file1: ลบการประกาศ getDefault () ในไฟล์ CustomController 2: ลบการนำ getDefault ไปใช้ ใน CustomCellView ไฟล์ 3:

    var parent: NamedSegues?
    ...
    parent?.executeSegueWithId(id)

คอมไพเลอร์ควรจับสิ่งนี้ได้และได้รับข้อความแสดงข้อผิดพลาดแทนที่จะโยนข้อผิดพลาดในการแบ่งส่วนระหว่างการสร้าง!


1

ดูเหมือนว่าคอมไพเลอร์ Swift 2 อาจยังไม่พร้อมสำหรับช่วงไพรม์ไทม์! ในกรณีนี้จะช่วยให้ทุกคนที่ผมได้รับความผิดพลาดในการแบ่งส่วน: 11 PFQuery.query.findObjectsInBackgroundWithBlockเนื่องจากไม่ตรงกันกับชนิดตัวแปรในส่วนหัวปิดโดยเฉพาะในวิธีการแยกวิเคราะห์

คุณสามารถดูปัญหาโดยละเอียดเพิ่มเติมได้ที่นี่: https://github.com/ParsePlatform/Parse-SDK-iOS-OSX/issues/280


1

เช่นเดียวกับที่@Fjohnกล่าวว่านี่เป็นปัญหาที่เกี่ยวข้องกับการแกะอุปกรณ์เสริมสำหรับฉัน (ยากจนทั้งใน Xcode 7.0 beta 6 และ Xcode 7) ในกรณีของฉันฉันไม่ได้แกะตัวเลือกเสริม (สิ่งที่ทำให้ฉันปิดคือดับเบิ้ล ?? ในตัวอธิบายการใช้if let ช่วยแก้ปัญหาได้

ตัวเลือกสองครั้งทำให้เกิดข้อผิดพลาดในการแบ่งส่วน


1

ตามที่คนอื่นเขียนไว้ข้างต้นสำหรับฉันสิ่งนี้เกิดขึ้นเมื่อฉันใช้ส่วนขยายบนโปรโตคอล แต่ลายเซ็นของวิธีการในโปรโตคอลไม่ตรงกับการใช้งานในส่วนขยาย

ในกรณีของฉันฉันได้เพิ่มพารามิเตอร์ใหม่ในการใช้งาน (ในส่วนขยาย) แต่ลืมที่จะเพิ่มลงในลายเซ็นของวิธีการในโปรโตคอล


1

ในกรณีของฉันฉันพยายามเพิ่มพารามิเตอร์ฟังก์ชันหลังพารามิเตอร์ตัวแปร

การย้อนกลับลำดับพารามิเตอร์และทำให้พารามิเตอร์ตัวแปรเป็นพารามิเตอร์สุดท้ายในรายการพารามิเตอร์ได้รับการแก้ไข


1

โดยทั่วไปจะเกิดขึ้นเมื่อคอมไพเลอร์ไม่มีข้อมูลเพียงพอ (แม้ว่าคุณจะคิดอย่างไร) เพื่อรับประกัน / กำหนดสถานะของคำสั่งหรือตัวแปรภายในคำสั่ง

ตัวอย่างเช่นสมมติว่าคุณมีพจนานุกรมประเภท [String: String] ซึ่งคุณเติมชื่อเมืองเป็นคีย์และรายการรหัสไปรษณีย์ / รหัสไปรษณีย์ที่คั่นด้วยจุลภาค

ลองนึกภาพว่าคุณต้องการอัปเดตรายการรหัสที่เกี่ยวข้องที่ไหนสักแห่งในรหัส:

myDict[town] += newZipCode + ","

ในกรณีนี้คอมไพลเลอร์จะตอบสนองด้วยความผิดพลาดในการแบ่งส่วนซึ่งtownอาจไม่มีอยู่ในพจนานุกรมดังนั้นจึงไม่สามารถรับประกันได้ว่าข้อความข้างต้นจะมีค่าที่ถูกต้อง

ในการแก้ไขปัญหานี้คุณควรจัดเก็บสถานะปัจจุบันของmyDict[town]ตัวแปรแยกต่างหากเพื่อให้คุณจัดการกับกรณีของkey not in dictแล้วอัปเดตค่าสำหรับคีย์ที่กำหนด:

myDict[town] = guaranteedValue + "," newZipCode + ","

น่าเสียดายที่ไม่สามารถระบุสาเหตุที่แท้จริงได้อย่างตรงไปตรงมาเสมอไปดังนั้นฉันหวังว่าตัวอย่างง่ายๆนี้จะช่วยได้


1

Swift 3.0 (Xcode 8.1) แสดงปัญหานี้เมื่อโปรโตคอลประกาศตัวแปรที่เป็นทางเลือกและผู้ดำเนินการใช้ตัวแปรนั้นเป็นค่าเริ่มต้นที่ขี้เกียจ

รายงานข้อผิดพลาดที่นี่: https://bugs.swift.org/browse/SR-1825


1

Xcode 8.2

การเพิ่ม@nonobjcการนำโปรโตคอลไปใช้ในส่วนขยายทำให้เกิดข้อผิดพลาดในการแบ่งส่วน ย้าย@nonobjcการใช้โปรโตคอลไปสู่การใช้งานคลาส


1

ในกรณีของฉันผู้ร้ายตั้งใจทำงานมากเกินไปโดยคาดหวังว่าอาร์กิวเมนต์อาร์เรย์ด้วยอาร์กิวเมนต์ที่มีตัวแปร :

public required init(_ args: Node...) {
}

เมื่อ superclass กำหนดให้เป็นอาร์เรย์:

public required init(_ args: [Node]) {
}

0

สำหรับฉันสิ่งต่อไปนี้ทำให้เกิด segfault ในขณะที่typeเป็นทางเลือก:

switch type {
    case .aType:
        // Do Something
    default:
        break
}

และสิ่งนี้แก้ไขได้:

switch type {
    case .Some(.aType):
        // Do Something
    default:
        break
}

0

ฉันได้รับข้อผิดพลาดนี้พร้อมลายเซ็นวิธีการต่อไปนี้ใน UITableViewController ที่กำหนดเอง

func filterContentForSearchText(searchText: String)

เปลี่ยนเป็น:

func filterContentForSearchText(searchText: String!)

แก้ไขปัญหา


0

ฉันมีปัญหาเดียวกันในส่วนขยาย ส่วนขยายของฉันมีตัวเริ่มต้นอำนวยความสะดวกสองตัว:

convenience init(context: NSManagedObjectContext) {
    let entityDescription = NSEntityDescription.entityForName("PropertyEntity", inManagedObjectContext: context)!
    self.init(entity: entityDescription, insertIntoManagedObjectContext: context)
}

convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) {
    self.init(context: context)
    property1 = (dictionary["key"] as? String) ?? ""
    // More properties...
}

เพื่อกำจัดข้อผิดพลาดฉันได้เพิ่มแผนที่วิธีการอินสแตนซ์ (พจนานุกรม: NSDictionary) และข้อผิดพลาดความผิดพลาดในการแบ่งส่วนก็หายไป

convenience init(dictionary: NSDictionary, context: NSManagedObjectContext) {
    self.init(context: context)
    map(dictionary)
}

0

สำหรับฉันปัญหาคือการที่สถาปัตยกรรมของฉันไม่ได้ตั้งค่าเป็นมาตรฐาน ฉันได้เพิ่ม i386 หรือบางอย่างเพียงแค่ตั้งค่ากลับเป็นค่าเริ่มต้น xcodeproject arch และคอมไพล์ได้ดี


0

ฉันมีปัญหาเดียวกันในโครงการที่รวดเร็ว ปัญหาคือฟังก์ชันที่ควรส่งคืนอ็อบเจ็กต์ แต่ไม่มีผลตอบแทนในนั้น ข้อผิดพลาดประเภทนี้ใช้ในการส่งสัญญาณขณะแก้ไขด้วย Obj-C ดูเหมือนว่า t จะไม่ใช่กรณีของ Swift

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.