如何在Swift中有条件地为tvOS进行编译

25

我该如何在Swift语言的同一文件中有条件地编译iOS和tvOS的代码? 我尝试了所有Objective-C风格的#if等方式来编写TARGET_OS_TV,正如在Apple文档和其他答案中所提到的,但我没有找到适用于Swift代码的可行解决方案。


这应该可以工作 #if TARGET_OS_TV NSLog(@"tVOS"); #else NSLog(@"不是iOS"); #endif - Adnan Aftab
4个回答

41
#if os(OSX)
// compiles for OS X
#elseif os(iOS)
// compiles for iOS
#elseif os(tvOS)
// compiles for TV OS
#elseif os(watchOS)
// compiles for Apple watch
#endif

谢谢。请给我一个清晰的例子。 - Pop
欢迎 @Pop。如果您能接受您喜欢的答案,那就太好了 :) 谢谢! - Lubos
CarPlay的操作系统是什么? - CDM social medias in bio

9

这也是苹果在针对您的应用程序定位Apple TV下所涵盖的内容。

代码清单1-1:Objective-C中的条件代码化

 #if TARGET_OS_TV
     NSLog(@"Code compiled only when building for tvOS.");
 #endif

清单1-2 在Swift中为tvOS设定条件代码
#if os(tvOS)
NSLog(@"Code compiled only when building for tvOS.");
#endif

if #available(tvOS 9.1,*) {
    print("Code that executes only on tvOS 9.1 or later.")
}

2
非常有帮助的是看到Objective-C和Swift语法之间的区别。 - Pop
当然,苹果公司在其1-2清单的条件Swift代码中意外地放置了Objective-C代码(NSLog()),因此它实际上应该是这样的:#if os(tvOS) print("仅在构建tvOS时编译的代码。") #endifif #available(tvOS 9.1,*) { print("仅在tvOS 9.1或更高版本上执行的代码。") } - Gorm

6
#if <build configuration> && !<build configuration>
statements
#elseif <build configuration>
statements
#else
statements
#endif

构建配置可以是以下内容:
os(abc),其中 abc 的有效值为 OSX、iOS、watchOS、tvOS、Linux
arch(abc),其中 abc 的有效值为 x86_64、arm、arm64、i386

请参阅苹果文档此处


3

我没有参考文档--虽然我想要一个--但我见过苹果的示例代码,其中有以下章节:

    #if os(iOS) || os(tvOS)
    #endif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接