这个问题与std :: initializer_list有关,以及为什么允许初始化基本类型.考虑以下两个功能:
void foo(std::string arg1, bool arg2 = false);
void foo(std::string arg1, std::deque<std::string> arg2, bool arg3 = false);
Run Code Online (Sandbox Code Playgroud)
为什么在这样调用foo时:
foo("some string", { });
Run Code Online (Sandbox Code Playgroud)
选择第一个重载,而不是第二个?好吧,实际上不是为什么它被选中,这是因为{ }可以用来初始化任何东西,包括原始类型.我的问题是这背后的原因.
std :: initializer_list采用{ args... },因此在编译时不能具有不确定的长度.试图这样做bool b = { true, true }给人error: scalar object 'b' requires one element in initialiser.
尽管允许统一初始化似乎是一个好主意,但事实是这是令人困惑且完全出乎意料的行为.确实,编译器如何才能做到这一点,在后台做一些魔术没有做std :: initializer_list的事情?
除非{ args... }是C++词法结构,否则我的观点仍然存在:为什么它允许用于原始类型的初始化?
谢谢.在意识到错误的重载被调用之前,我在这里遇到了很多错误.用了10分钟搞清楚原因.
直截了当 - 我正在尝试将两个(或更多)llvm模块链接在一起,而我正面临来自LLVM的某个奇怪错误.
我不想发布太多代码,所以我会在这里使用一堆伪.
我有3个模块,比方说A,B和C. A是主要模块; 我llvm::Linker用它初始化.B和C是辅助模块; 我打电话linker.linkInModule(B and C).
除其他外,所有3个模块都定义了以下两种类型:
%String = type { i8*, i64 }
%Character = type { i8*, i64 }
Run Code Online (Sandbox Code Playgroud)
请注意,它们具有相同的成员类型.此外,函数foo定义为(在模块B中):
define i1 @_ZN9Character7hasDataEv(%Character*) { }
Run Code Online (Sandbox Code Playgroud)
这个函数在模块A和C中声明.现在,一切看起来都很好 - 从模块A和C调用此函数,并且IR看起来很正常,如下所示:
%21 = call i1 @_ZN9Character7hasDataEv(%Character* %4)
Run Code Online (Sandbox Code Playgroud)
问题出在这里:当所有3个模块链接在一起时,这些类型会发生一些事情:
%2(%String)和%3(%Character).奇怪的是,虽然这种转换发生在模块A和C中,但这种错误只发生在C中 - 注意A是所谓的"主"模块.
现在是链接文件的函数定义
define i1 @_ZN9Character7hasDataEv(%2*)
Run Code Online (Sandbox Code Playgroud)
注意如何%Character,或者%3,变成了%2.此外,在呼叫网站,可能是尝试取消合并类型,我得到了这个:
%10 = call i1 bitcast (i1 (%2*)* @_ZN9Character7hasDataEv to …Run Code Online (Sandbox Code Playgroud) 问题很简单:我到底如何Text才能正确地设置动画?
struct ContentView: View {
@State var foozle: String = ""
var body: some View {
VStack() {
Spacer()
Text(self.foozle)
.frame(maxWidth: .infinity)
.transition(.opacity)
Button(action: {
withAnimation(.easeInOut(duration: 2)) {
self.foozle = "uuuuuuuuu"
}
}) { Text("ugh") }
Spacer()
}.frame(width: 320, height: 240)
}
}
Run Code Online (Sandbox Code Playgroud)
问题:视图坚持做一些愚蠢的动画,其中文本被新文本替换,但被省略号截断,它慢慢地横向扩展,直到显示整个新文本。
当然,这不是关于不透明度的动画。这不是框架宽度问题,因为我已经通过绘制边框进行了验证。
这只是 SwiftUI 中我将不得不处理的另一个愚蠢的错误,并祈祷有人修复它吗?
编辑:好的,感谢@Mac3n,我得到了这个灵感,它可以正常工作,即使它有点难看:
Text(self.foozle)
.frame(maxWidth: .infinity)
.opacity(op)
Button(action: {
withAnimation(.easeOut(duration: 0.3)) {
self.op = 0
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
self.foozle += "omo"
withAnimation(.easeIn(duration: 0.3)) {
self.op = 1
} …Run Code Online (Sandbox Code Playgroud)