Swift Framework trả về 'sử dụng mơ hồ' phần mở rộng phương thức trong lldb


8

Tôi đã nâng cấp lên Xcode 11 & swift 5 và gặp sự cố với tiện ích mở rộng phương thức khi chúng được cung cấp qua khung. Cụ thể hơn, trong một dự án có cấu trúc như thế này:

-> Main Project
-> Framework created from sources in 'Main Project'
-> Subproject using the above Framework (Sources packaged in the framework are not visible to the sub-project)

Mọi thứ biên dịch và chạy tốt, nhưng khi chạy các phiên gỡ lỗi trên tiểu dự án, tất cả các tiện ích mở rộng trong 'Framework' trở lại error: ambiguous use ofkhi được gọi từ dòng lệnh lldb. Đây là một mẫu mã để đưa ra một ý tưởng:

Tạo dự án dòng lệnh macOs và thêm mục tiêu mới, 'MagicFramework' và trong tệp Spells.swift (đảm bảo tệp hiển thị với Main & MagicFramework)

import Foundation

extension String {
    public func castSpell() -> String {
        return "✨ " + self
    }
}

Sau đó, tạo một tiểu dự án 'Trình hướng dẫn' và trong tệp wizard.swift (chỉ hiển thị với Trình hướng dẫn):

import Foundation
import MagicFramework


public class Tadaa {

    public func magic(spell:String) -> String {
        return spell.castSpell()
    }
}

trong tệp main.swift của Wizard, thêm:

import Foundation

let aa = Tadaa().magic(spell: "this is magic")

print(aa)

Bạn nên có cấu trúc sau:

-> Main project
----> MagicFramework
----> Wizard subproject

sau đó xây dựng và chạy phụ 'Wizard', với một điểm dừng spell.castSpell()trong Tadaa. Tại dấu nhắc lldb, gõ:

(lldb)po spell.castSpell()
error: <EXPR>:3:1: error: ambiguous use of 'castSpell()'
spell.castSpell()

tại sao?? Vấn đề này đã không xảy ra với Xcode 10.

Câu trả lời:


7

Theo ý kiến ​​khiêm tốn của tôi, đây chỉ có thể là một lỗi.

Nếu tôi thiết lập ví dụ bạn đưa ra trong câu hỏi của bạn, tôi có thể tái tạo vấn đề.

Ở điểm dừng, tôi nhận được

(lldb) po spell.castSpell()
error: <EXPR>:3:1: error: ambiguous use of 'castSpell()'
spell.castSpell()
^

đúng như bạn mô tả

Tuy nhiên, nếu tôi tìm kiếm chức năng castSpelltrong lldb, tôi nhận được:

(lldb) image lookup -vn castSpell
1 match found in /Users/lameyl01/Library/Developer/Xcode/DerivedData/Main-dsjbnoyousgzmrdnqxtxoeyeyzpv/Build/Products/Debug/MagicFramework.framework/Versions/A/MagicFramework:
        Address: MagicFramework[0x0000000000000ab0] (MagicFramework.__TEXT.__text + 0)
        Summary: MagicFramework`(extension in MagicFramework):Swift.String.castSpell() -> Swift.String at Spells.swift:12
         Module: file = "/Users/lameyl01/Library/Developer/Xcode/DerivedData/Main-dsjbnoyousgzmrdnqxtxoeyeyzpv/Build/Products/Debug/MagicFramework.framework/Versions/A/MagicFramework", arch = "x86_64"
    CompileUnit: id = {0x00000000}, file = "/Users/lameyl01/tmp/Main/MagicFramework/Spells.swift", language = "swift"
       Function: id = {0x100000038}, name = "(extension in MagicFramework):Swift.String.castSpell() -> Swift.String", mangled = "$sSS14MagicFrameworkE9castSpellSSyF", range = [0x000000010033fab0-0x000000010033fb21)
       FuncType: id = {0x100000038}, byte-size = 8, decl = Spells.swift:12, compiler_type = "() -> ()"
         Blocks: id = {0x100000038}, range = [0x10033fab0-0x10033fb21)
      LineEntry: [0x000000010033fab0-0x000000010033fabf): /Users/lameyl01/tmp/Main/MagicFramework/Spells.swift:12
         Symbol: id = {0x00000005}, range = [0x000000010033fab0-0x000000010033fb21), name="(extension in MagicFramework):Swift.String.castSpell() -> Swift.String", mangled="$sSS14MagicFrameworkE9castSpellSSyF"
       Variable: id = {0x100000055}, name = "self", type = "Swift.String", location = DW_OP_fbreg(-16), decl = Spells.swift:12

Vì vậy, điều đó có nghĩa là lldb đã tìm thấy chính xác một trận đấu: Phần mở rộng trong MagicFrameworkthư viện. Vì vậy, không có lý do tại sao điều này nên mơ hồ.

Để hoàn thiện, tôi cũng đã kiểm tra loại biến spellnhư llbd thấy nó:

(lldb) frame variable spell
(String) spell = "this is magic"

Vì vậy, để tóm tắt: lldb biết loại là String. Nó biết rằng có một hàm castSpellđược định nghĩa trong phần mở rộng và nó biết chính xác một cách thực hiện của hàm đã nói. Nhưng nó vẫn hiển thị thông báo lỗi.

Vì vậy, trừ khi tôi thiếu một cái gì đó thiết yếu ở đây, đây phải là một lỗi lldb.


Âm thanh về đúng :) cảm ơn rất nhiều cho các chi tiết! Bạn có biết có cách nào để giải quyết không?
Alex

1
Xin lỗi Alex, không biết làm thế nào để giải quyết vấn đề này cho một lib năng động. Nhưng nếu bạn có thể biến MagicFramework của mình thành một thư viện tĩnh thì điều này sẽ không có vấn đề gì (Loại Mach-O trong Cài đặt bản dựng cho mục tiêu, hãy đảm bảo chạy Sản phẩm-> Thư mục bản dựng sạch sau khi thay đổi cài đặt này)
Lutz

@Alex và Lutz Cảm ơn câu hỏi và câu trả lời này. Tôi tìm thấy một công việc khủng khiếp xung quanh, nhưng một công việc xung quanh không hơn không kém. Tôi đã tạm thời thêm một lớp D với các phương thức tĩnh gọi xuống các phương thức của phần mở rộng (lấy đối tượng làm tham số) và sau đó gọi phần mở rộng từ đó; mà sẽ giúp tôi cho đến khi điều này được cố định.
aepryus

0

Tôi đã có cùng một vấn đề với phần mở rộng của tôi. Trong tình huống của tôi, đó là một hàm duy nhất mà tôi đang sử dụng rất nhiều trong khi gỡ lỗi, vì vậy tôi vừa tạo một hàm toàn cục mà trong trường hợp của bạn sẽ chỉ chấp nhận chuỗi và gọi phần mở rộng đó bên trong. Thực sự giống với những gì @aepryus đã chỉ ra trong bình luận cho câu trả lời đầu tiên.

import Foundation

extension String {
    public func castSpell() -> String {
        return "✨ " + self
    }
}

func castSpell(_ string: String) -> String {
    return string.castSpell()
}

Sau đó sử dụng nó như thế:

(lldb) po castSpell("this is magic")
"✨ this is magic"

(lldb) 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.